You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下使用umask配合open调用设置666文件权限异常问题咨询

问题根本原因

你犯了两个常见的编程错误,共同导致最终权限不符合预期:

  • 第一个错误:C语言中八进制数值常量必须加前导0,你写的umask(111)传入的是十进制111,而非你预期的八进制0111
    十进制111转换为八进制为0157,对应的权限屏蔽位是:屏蔽所有者执行位、屏蔽组的读+执行位、屏蔽其他用户的读+写+执行位
  • 第二个错误:你给open传入的创建权限是S_IRWXU|S_IRWXG|S_IRWXO,也就是八进制0777(读写执行全开放),最终权限计算逻辑是:

    最终文件权限 = open传入的mode & (~umask值)
    代入你实际的参数计算:
    0777 & (~0157) = 0777 & 0620 = 0620,正好对应你看到的-rw--w----权限结果

正确实现方式

如果你要得到权限为666(所有者读写、组读写、其他用户读写)的文件,两种实现方案:

方案1:固定open的mode为0666,临时修改umask为0

// 临时修改umask为0,同时保存原有umask
mode_t old_umask = umask(0);
int fd = open(".sample", O_CREAT | O_RDWR, 0666);
// 恢复原有umask,避免影响进程后续创建文件的权限
umask(old_umask);

这种方案最稳妥,不管进程原有umask是多少,都能保证创建的文件权限是0666。

方案2:如果你一定要用umask(0111)实现,注意参数加前导0,同时open传0777

// 必须加前导0标识是八进制
umask(0111);
int fd = open(".sample", O_CREAT | O_RDWR, S_IRWXU|S_IRWXG|S_IRWXO);

计算逻辑:0777 & (~0111) = 0666,也能得到预期结果,但会修改进程全局的umask,可能影响后续其他文件创建的权限,更推荐方案1。

内容的提问来源于stack exchange,提问作者Jim Moriarty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:57:04