我正在尝试mmap一个文件进行读写,目前我收到的是errcode 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()兼容的文件。
两个错误:
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
。