我正在使用以下代码在 C 中创建文件:
int outfd = open(arg,O_CREAT|O_TRUNC|O_WRONLY, f_per);
f_per
是文件权限编号。
将f_per
设置为0644
,执行代码并执行ls -l可以将(输出)文件权限设置为-rw-r--r--
,这是预期的。但是,将事物设置为0777会将权限设为-rwxrwxr-x
而不是-rwxrwxrwx
。知道为什么会这样吗?
答案 0 :(得分:1)
根据POSIX page for the open
call,在O_CREAT
下:
...文件模式的访问权限位应设置为oflag参数后面的参数值,类型
mode_t
修改如下:按位AND执行关于文件模式位和进程'文件模式创建掩码的补码中的相应位。
模式创建掩码(或umask)可以被认为是减法掩码。例如,如果您在文件模式创建掩码为rwxrwxrwx/0777
时尝试创建具有权限-------w-/0002
的文件,则实际上最终会得到:
rwxrwxrwx
& rwxrwxr-x (complement of -------w-)
=========
rwxrwxr-x
这似乎是您遇到的情况。
如果要实际创建具有特定权限的文件,可以通过将umask设置为零(并在之后恢复)来暂时禁用umask,如:
mode_t oldmask = umask(0); // needs sys/stat.h
int outfd = open(arg, O_CREAT|O_TRUNC|O_WRONLY, 0777);
umask(oldmask);