Linux下C++程序创建全权限文件后mmap()权限被拒问题咨询
解决mmap()权限被拒的问题
嘿,我一眼就看到你代码里的问题了——你把creat()函数的参数用错啦!
先给你拆解下问题根源:
creat()函数的第二个参数是文件权限模式(mode),不是open()函数里的打开标志(比如O_RDWR、O_CREAT这些)。creat()本质上等价于open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode),也就是说它默认是以只写模式打开文件的。- 而你调用
mmap()的时候指定了PROT_READ | PROT_WRITE,同时用了MAP_SHARED,这就要求文件描述符必须是可读可写的。用只写的文件描述符去做可读写的内存映射,自然会触发权限被拒的错误。
修复方案
直接换掉creat(),用open()函数明确指定打开模式和权限:
int outfile = open("outFile.txt", O_RDWR | O_CREAT | O_TRUNC, S_IRWXU | S_IRWXG | S_IRWXO);
解释下这几个参数:
O_RDWR:以可读可写模式打开文件,满足mmap的权限要求O_CREAT:如果文件不存在则创建O_TRUNC:如果文件已存在,就把它截断为空文件(和creat的行为一致)- 最后一个参数才是正确的文件权限位,就是你原来写的那些
S_IRWXU之类的
另外提个小细节:你之前循环写入pagesize个-是对的,因为mmap要求映射的范围不能超过文件当前的大小(除非用特殊标志),这步操作确保了文件大小足够,避免了另一个可能的mmap失败原因。
内容的提问来源于stack exchange,提问作者Nick B.




