Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在Linux上使用开放系统调用创建文件时,为什么会更改文件权限?_C_Linux - Fatal编程技术网

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 */ }