我想将文件的某些部分映射到内存中,为此我必须使用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。什么论点无效?有没有办法看到它?
答案 0 :(得分:3)
你做错了不是检查究竟是什么问题。如果出现错误,mmap()
不仅会返回MAP_FAILED
(建议您使用-1
代替},而且还会将errno
设置为适当的值。因此,您可以自己检查errno
或使用perror()
打印错误说明,该说明可以回答您的问题(并节省大量时间;))。除此之外,仅在Linux上支持MAP_ANONYMOUS
与MAP_SHARED
一起使用,因为内核2.4;也许你有一个旧版本的Linux内核?