Проблема с get и mmap - PullRequest
0 голосов
/ 08 июня 2018

У меня есть этот код, предоставленный моим учителем, он открывает файл, отображает в память с помощью mmap, а затем записывает строку, используя get.Проблема в том, что он записывает в файл только первые 2 символа строки, даже если printf печатает всю строку.Любой совет?

#include <stdlib.h>
#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>

#define PAGE_SIZE (8192) 


int main(int argc, char** argv){

    pid_t pid;
    int fd;
    char* buffer;

    if (argc!= 2) {
            printf("Syntax: prog file_name\n");
        return -1;
    }


    fd=open(argv[1], O_RDWR);

    if (fd== -1) {
     printf("open error");
     return -2; 
    }


    buffer = (char*)mmap(NULL,PAGE_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    close(fd);
    if (buffer == NULL){
        printf("mmap error\n");
        return -3;

    }   

    pid = fork();

    if(pid == -1){
        printf("fork error\n"); 
        return -4;

    }

    if(pid == 0){
        gets(buffer);       
        return 0;
    }   

    waitpid(pid, NULL);

    printf("%s\n",buffer);

    return 0;


}

1 Ответ

0 голосов
/ 08 июня 2018

mmap создает связь между областью памяти и текущим экстентом файла (называемого "файлом резервной копии").Он не меняет размер файла и не обязательно учитывает какие-либо изменения в размере файла.

Возможно, ваш учитель пытается показать вам этот факт в этом примере.

В случае, если файл короче, чем отображенный объем памяти, остальная часть экстента заполняется нулями при выполнении mmap.Однако изменения в этом регионе не будут записаны в файл резервной копии и могут или не могут быть видны другим процессам, использующим сопоставление, даже если было установлено MAP_SHARED.

Если вы создалисопоставленный регион с включенной записью, следует избегать ссылки на часть региона, отсутствующую в файле.(Если вы просто хотите, чтобы файл был постоянной резервной копией совместно используемой памяти, вам, вероятно, следует использовать ftruncate, чтобы установить размер файла в соответствии с желаемым размером отображения.) Это необходимо сделать перед вызовом mmap, потому что если размерфайл изменяется во время действия сопоставления, результатом является неопределенное поведение.

...