一尘不染

读写mmap的参数无效?

linux

-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


阅读 333

收藏
2020-06-03

共1个答案

一尘不染

原来将更MAP_SHARED改为MAP_PRIVATE可以使此操作成功。

失败的原因很微妙:我的代码正在VirtualBox
VM内运行,而我试图的文件mmap位于主机上的共享目录中。显然,VirtualBox虚拟文件系统无法mmap使用MAP_SHARED跨虚拟机管理程序边界的选项来实现。

如果您在我的问题和他的回答上都读到jxh的有用评论,那么事实证明该代码对他有用,因为他可能正在尝试将mmap主机文件系统文件放入主机内存中。

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

解决方案是将我要映射的文件移动到来宾的硬盘中,然后从那里进行操作。

2020-06-03