C 在Linux上使用开放系统调用创建文件时,为什么会更改文件权限?
我正在使用C 在Linux上使用开放系统调用创建文件时,为什么会更改文件权限?,c,linux,C,Linux,我正在使用open系统调用创建一个具有完全权限(777)的文件,但是当我执行ls-l时,我只能看到权限为(755)。你能告诉我为什么文件权限不是777吗 代码 #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> int main() { int fd; /* Creates a file with full permission*/
open
系统调用创建一个具有完全权限(777)的文件,但是当我执行ls-l
时,我只能看到权限为(755)。你能告诉我为什么文件权限不是777吗
代码
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
int main()
{
int fd;
/* Creates a file with full permission*/
fd = open("test", O_CREAT | O_RDWR | O_APPEND, 0777);
if (fd = -1)
{
return -1;
}
close(fd);
}
有一个由系统维护的值叫做
umask
;它是流程的属性,就像PID(流程ID)或EUID(有效用户ID)一样。它将被设置为022
(八进制),这表示系统应该从创建的文件中删除组和其他写入权限
您可以在使用open()
之前调用,这样您在open()
中指定的模式就不会改变。您当然应该这样做,以证明umask
是问题所在。然而,通常最好让用户选择umask
占上风,如果程序不遵守我的umask设置,我就很难做到这一点;在我发现并验证问题后,它往往不再使用
shell还有一个(内置)命令
umask
,您可以使用它。022
值是合理的默认值;大多数情况下,您不希望任何人对您的文件进行写入。已创建文件的权限受进程当前的umask
限制——您当前的umask
为022
,因此默认情况下始终禁用组和全局写入。(在大多数情况下,这是一件好事。)如果您确实想要一个组和全局可写文件,则需要在创建此文件时临时设置umask(0)
(确保保存系统调用返回的旧值,然后再设置!),或者使用chmod()手动设置文件的权限
umask
将返回掩码的原始值,因此要临时重置掩码,只需执行以下操作
#include <sys/types.h>
#include <sys/stat.h>
mode_t old_mask = umask(0);
...
umask(old_mask);
它与
umask
有关。请参见,例如,顺便提一下,if(fd=-1)
中的赋值应该是比较if(fd=-1)
。但是,这只会影响程序的退出状态,而不会影响创建文件的权限。此外,还要考虑测试文件是否真的应该是可执行的。我建议,对于一个文件,0666权限通常比0777权限更合适。目录是另一回事;在这里,执行(访问)权限很重要。
#include <sys/types.h>
#include <sys/stat.h>
mode_t old_mask = umask(0);
...
umask(old_mask);
fd = open("test", O_CREAT | O_RDWR | O_APPEND, 0777);
if (fd < 0) { ... }
int rv = fchmod(fd, 0777);
if (rv < 0) { /* fchmod errored */ }