C中的文件创建权限

Posted

技术标签:

【中文标题】C中的文件创建权限【英文标题】:File creation permissions in C 【发布时间】:2015-03-29 19:48:21 【问题描述】:

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

【问题讨论】:

如果您使用的是 POSIX:umask? 参见。 unix.stackexchange.com/questions/93269/… 啊!我错过了unmask。它到底有什么作用? (对 C 不是很有经验) 不是unmaskumask。如man umask? @EOF 陷阱。谢谢! 【参考方案1】:

根据POSIX page for the open call,在O_CREAT下:

...文件模式的访问权限位应设置为类型为mode_t的oflag参数后面的参数值修改如下:对文件模式位和进程的文件模式创建掩码的补码中的相应位。

模式创建掩码(或 umask)可以视为减法掩码。例如,如果您在文件模式创建掩码为 -------w-/0002 时尝试创建权限为 rwxrwxrwx/0777 的文件,您实际上会得到:

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

【讨论】:

以上是关于C中的文件创建权限的主要内容,如果未能解决你的问题,请参考以下文章

Win 10 + Git - 无法创建文件 - 权限被拒绝

如何在 C 中创建具有设置权限/时间/等的文件?

为啥要执行权限以及在 c(Linux) 中创建文件所需的写权限? [关闭]

Linux组管理和权限管理

PHP中常用操作文件的方法

系统创建文件失败...权限被拒绝 - cPanel