Как разрешить ENODEV при использовании mmap для чтения / записи в файл - PullRequest
2 голосов
/ 21 апреля 2019

Я пытаюсь отобразить файл для чтения и записи, и в настоящее время я получаю код ошибки 19: ENODEV.Я использую пустой файл с 2 МБ свободного места.

Согласно справочным страницам, эта ошибка возникает, когда файл не совместим для сопоставления.Если это правда, я не понимаю, почему;Это просто обычный пустой файл.Кроме того, он был предоставлен моим профессором, поэтому, по-видимому, он должен работать нормально.Что-нибудь еще происходит?

Вот мой код:

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

int main(int argc, const char * argv[]) {
    int fd = open("Drive2MB", O_RDWR, S_IRUSR | S_IWUSR | S_IXUSR);
    if(fd < 0) {
        printf("open failure\n");
        exit(1);
    }

    char *drive = mmap(NULL, 1048576, PROT_WRITE, fd, MAP_SHARED, 0); 
    if(drive == MAP_FAILED) {
        printf("map failure\n");
        fprintf(stderr, "Value of errno: %d\n", errno);
        exit(1);
    }

    //test
    drive[513] = 'p';
    printf("%c", drive[513]);
}

Если это действительно файл, как бы мне создать файл, совместимый с mmap ().

1 Ответ

1 голос
/ 21 апреля 2019

Две ошибки:

char *drive = mmap(NULL, 1048576, PROT_WRITE, fd, MAP_SHARED, 0); 

должно быть

char *drive = mmap(NULL, 1048576, PROT_WRITE, MAP_SHARED, fd, 0); 

и вы не можете отобразить пустой файл, а только файл, который уже имеет длину.

Для заполнения Drive2MB сделать dd if=/dev/zero of=Drive2MB bs=1048576 count=1

MAP_SHARED случайно имеет значение 1, поэтому он попытался mmap stdout, который обычно является терминалом, который не может быть отображен.

...