mmap стирает мой файл, а не копирует его

Поэтому я использую mmap для записи в другой файл. Но странная вещь в том, что когда мой код попадает в mmap, он очищает файл. Итак, у меня есть файл со случайными символами (AB, HAA, JAK и т. Д.). То, что он должен сделать, это использовать mmap как прочитанное, а затем записать этот файл в новый файл. Так что первый if (argc == 3) - это обычные операции чтения и записи, второй if (argc ==4) должен использовать mmap. У кого-нибудь есть идеи, почему на Земле это происходит?

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/io.h>
#include <sys/mman.h>

#include <sys/time.h>
#include <sys/resource.h>


int main(int argc, char const *argv[])
{
    int nbyte = 512;
    char buffer[nbyte];
    unsigned char *f;
    int bytesRead = 0;
    int size;
    int totalBuffer;
    struct stat s;
    const char * file_name = argv[1];
    int fd = open (argv[1], O_RDONLY);
    int i = 0;
    char c;

    int fileInput = open(argv[1], O_RDONLY);
    int fileOutPut = open(argv[2], O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR);

    fstat(fileInput, &s);
    size = s.st_size;
    printf("%d\n", size);
    if (argc == 3)
    {
        printf("size: %d\n", size);
        printf("nbyte: %d\n", nbyte);

        while (size - bytesRead >= nbyte)
        {
            read(fileInput, buffer, nbyte);
            bytesRead += nbyte;
            write(fileOutPut, buffer, nbyte);
        }

        read(fileInput, buffer, size - bytesRead);
        write(fileOutPut, buffer, size - bytesRead);
    }

    else if (argc == 4)
    {
        int i = 0;
        printf("4 arg\n");
        f = (char *) mmap (0, size, PROT_READ, MAP_PRIVATE, fileInput, 0);
        /* This is where it is being wipped */
    }

    close(fileInput);
    close(fileOutPut);

    int who = RUSAGE_SELF;
    struct rusage usage;
    int ret;

    /* Get the status of the file and print some.   Easy to do what "ls" does with fstat system call...  */
    int status = fstat (fd, & s);
    printf("File Size: %d bytes\n",s.st_size);
    printf("Number of Links: %d\n",s.st_nlink);

    return 0;
}

РЕДАКТИРОВАТЬ: я хотел бы отметить, что первое чтение и запись работает отлично, это только тогда, когда вы пытаетесь сделать это через mmap.

1 ответ

Если вы имеете в виду, что он очищает ваш целевой файл, то да, именно это и сделает ваш код.

Он открывает пункт назначения с усечением, а затем, в вашем argc==4 В разделе вы отображаете входной файл, но абсолютно ничего не делаете для передачи данных в выходной файл.

Вам понадобится while цикл некоторого описания, похожий на тот, что в argc==3 случай, но который записывает байты в отображенной памяти в fileOutput дескриптор.

Другие вопросы по тегам