使用mmap读取/写入文件时如何解析ENODEV

时间:2019-04-21 18:02:48

标签: c mmap

我正在尝试映射文件以进行读写,目前我收到错误代码19:ENODEV。我正在使用2MB空间的空白文件。

根据手册页,当文件与映射不兼容时,会发生此错误。如果这是真的,我不明白为什么。这只是一个常规的空文件。此外,它是由我的教授提供的,因此大概应该可以正常工作。还有其他事情吗?

这是我的代码:

#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 个答案:

答案 0 :(得分:1)

两个错误:

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(通常是终端,无法映射)进行