C中的文件创建权限

时间:2015-01-30 10:44:21

标签: c file file-permissions

我正在使用以下代码在 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。知道为什么会这样吗?

1 个答案:

答案 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);