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 不是很有经验)
不是unmask
。 umask
。如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中的文件创建权限的主要内容,如果未能解决你的问题,请参考以下文章