读写mmap的参数无效?

我出于某种原因得到了-EINVAL ,而且我不清楚为什么。 这里是我打开并尝试mmap文件的地方:

 if ((fd = open(argv[1], O_RDWR)) < 0) { fprintf(stderr, "Failed to open %s: %s\n", argv[1], strerror(errno)); return 1; } struct stat statbuf; if (fstat(fd, &statbuf)) { fprintf(stderr, "stat filed: %s\n", strerror(errno)); return 1; } char* fbase = mmap(NULL, statbuf.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (fbase == MAP_FAILED) { fprintf(stderr, "mmap failed: %s\n", strerror(errno)); return 1; } 

编辑:我应该补充,错误发生在mmap

Solutions Collecting From Web of "读写mmap的参数无效?"

原来把MAP_SHARED MAP_PRIVATE可以让这个成功。

这是失败的原因是微妙的:我的代码运行在一个VirtualBox虚拟机,我试图mmap的文件是在我的主机上的共享目录。 VirtualBox虚拟文件系统显然没有在管理程序的边界上使用MAP_SHARED选项实现mmap

如果你会在我的问题和他的回答中看到jxh的有用评论,结果发现这个代码对他来说是有效的,因为他很可能试图把主机文件系统文件mmap到主机内存中。

我的观察是,从MAP_SHARED切换到MAP_PRIVATE也与此一致:由于私有映射内存对其他进程是不可见的,因此虚拟文件系统驱动程序可能不会反对映射内存。

解决的办法是把我想映射的文件移动到客户的硬盘上,然后从那里执行操作。

你的statbuf.st_size0 。 如果长度参数为0mmap()将失败。

EINVAL错误mmap()有3个列出的原因:

 void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); 

  • 我们不喜欢addrlengthoffset (例如,它们太大,或不在页面边界上对齐)。
  • (从Linux 2.6.12开始) length为0。
  • flags既不包含MAP_PRIVATEMAP_SHARED ,也不包含这两个值。