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
相关产品推荐
相关产品推荐

