1

我想将文件的某些部分映射到内存中,为此我必须使用 mmap()。(项目要求)我打开文件:

file = open(fileName, O_RDWR, 0)

它确实定期打开(文件!= -1)。

然后,在 for() 中,我尝试映射:

char *res;
res = (char*)mmap((void*)sectionHeads[i].adr, sectionHeads[i].size, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, file, sectionHeads[i].offset);

sectionHead 包含地址的 adr(int) 等等。但结果我总是得到-1。我查了一下,那部分内存应该是空闲的。我究竟做错了什么?

注意:这是我第一次使用 mmap(),稍后我会考虑标志,但现在我只想映射一个部分。部分包含有效值,请仔细检查。

更新:正如建议的那样,我打电话perror ("mmap error");查看错误是什么,我得到了mmap error: Invalid argument. 第一个sectionHeads的adr、size和offset的值为:adr=8154 size=13 offset=154。我也扔掉了 MAP_ANON。什么论据是无效的?有办法看到吗?

4

1 回答 1

3

你做错的不是检查到底是什么错误。出错时,mmap()不仅会返回MAP_FAILED(我建议您使用它来代替-1),而且还会设置errno为适当的值。因此,您可以检查errno自己或使用perror()打印错误描述来回答您的问题(并为您节省大量时间;))。除此之外,仅从内核 2.4 起,Linux 才支持MAP_ANONYMOUS与 with 结合使用;MAP_SHARED也许您有旧版本的 Linux 内核?

于 2013-05-31T14:05:42.923 回答