2013-05-31 610 views
1

我想映射文件的某些部分到内存中,为此我必须使用mmap()。 (项目的REC t) 我打开该文件:mmap()总是返回-1

file = open(fileName, O_RDWR, 0) 

和它打开regulary(文件!= -1)。

然后,内为(),我尝试配图:

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。第一部分头的adr值,大小和偏移量为:adr = 8154 size = 13 offset = 154。我也抛出了MAP_ANON。什么论据是无效的?有没有办法看到这个?

+2

因此,请检查'errno'。 – kirelagin

+0

要添加到@ kirelagin的评论:只要你检测到'mmap()'已经返回-1,即'perror(“mmap error”),就调用'perror()'' - 它会告诉你什么错误代码是。 –

回答

3

你在做什么错是没有检查到底是什么错误。出错时,mmap()不仅会返回MAP_FAILED(我建议您使用它来代替-1),但它也会将errno设置为适当的值。所以你可以自己检查errno或者使用perror()来打印错误描述,它可以回答你的问题(并且节省你很多时间;))。除此之外,MAP_ANONYMOUSMAP_SHARED一起使用仅在内核2.4以后的Linux上受支持;也许你有一个旧版本的Linux内核?

+0

我得到mmap“错误:无效的参数”。我从一个部分头的参数是: adr = 8154 size = 13 offset = 154。作为一项预防措施,我也抛出了MAP_ANON。任何想法哪个论点是无效的? –

+1

@InvaderZim:你甚至没有阅读[手册页](http://man7.org/linux/man-pages/man2/mmap.2.html),是吗?例如,您的偏移量不是页面大小的倍数。如果您要创建匿名映射,则不清楚为什么需要文件。映射地址的开始看起来不正确...继续挖掘。 – 2013-05-31 14:48:18

+0

我明白偏移量的问题,但为什么地址看起来有问题?另外,有没有一种方法来映射数组中的字节?在我到达mmap节之前,我读取了我需要的文件中的所有字节。这样我就消除了偏移量,并使其成为页面大小的倍数等。 –