You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Linux下C++程序创建全权限文件后mmap()权限被拒问题咨询

解决mmap()权限被拒的问题

嘿,我一眼就看到你代码里的问题了——你把creat()函数的参数用错啦!

先给你拆解下问题根源:

  • creat()函数的第二个参数是文件权限模式(mode),不是open()函数里的打开标志(比如O_RDWRO_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.

火山引擎 最新活动