Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C mmap()始终返回-1_C_File_Mmap - Fatal编程技术网

C mmap()始终返回-1

C mmap()始终返回-1,c,file,mmap,C,File,Mmap,我想将文件的某些部分映射到内存中,为此我必须使用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, se

我想将文件的某些部分映射到内存中,为此我必须使用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);
节头包含地址的adr(int)等。但结果我总是得到-1。我检查过了,那部分内存应该是空闲的。我做错了什么

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


更新:根据建议,我称之为
perror(“mmap错误”)
查看错误是什么,我得到
mmap error:Invalid argument
。第一个分段头的adr、尺寸和偏移值为:adr=8154尺寸=13偏移=154。我还抛出了MAP_ANON。什么论点是无效的?有什么办法可以看出这一点吗?

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

添加到@kirelagin的注释中:只要检测到
mmap()
返回-1,就调用
perror()
,即
perror(“mmap错误”)--它将告诉您错误代码是什么。我得到mmap“error:无效参数”。其中一个分区的参数是:adr=8154 size=13 offset=154。为了预防起见,我还扔掉了MAP_ANON。知道哪一个论点是无效的吗?@Investrzim:你甚至没有读过这篇文章,是吗?例如,偏移量不是页面大小的倍数。如果要创建匿名映射,则不清楚为什么需要文件。映射地址的开头看起来也不正确。。。继续挖掘。我理解偏移量的问题,但为什么地址看起来有问题?还有,有没有办法从数组映射字节?在到达mmap部分之前,我从文件中读取了所需的所有字节。这样我就消除了偏移量,并将其设置为页面大小等的倍数。@investrzim:8154对于用户空间虚拟地址来说有点太低了。而且,除非您实际在内核中运行并具有对MMU的访问权限,并且可以设置指向同一组物理地址的另一个虚拟页映射,否则您无法真正映射数组中的字节。因此,对于用户空间程序,答案是否定的。@investrzim:事实上,如果您试图将文件内容映射到内存中,请将
NULL
作为第一个参数传递,并让Linux决定使用的最佳地址。然后以页面大小的倍数传递大小(通常是文件的大小,但可以更小)和偏移量(不要硬编码,使用。对于标志,只需使用
MAP\u SHARED
)。