c - 为什么在 Linux 上使用 open 系统调用创建文件时会更改文件权限?

标签 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*/
        fd = open("test", O_CREAT | O_RDWR | O_APPEND, 0777);

        if (fd = -1)
        {
                return -1;
        }

        close(fd);
}

输出

     $ ls -l
    -rwxr-xr-x 1 ubuntu ubuntu    0 2012-09-19 11:55 test

最佳答案

系统维护了一个名为umask 的值;它是进程的一个属性,就像 PID(进程 ID)或 EUID(有效用户 ID)一样。它将被设置为 022(八进制),表示系统应该从创建的文件中删除组和其他写入权限。

您可以调用umask(0);在使用 open() 之前,这样您在 open() 中指定的模式将不会被更改。您当然应该这样做以证明 umask 是问题所在。然而,通常最好让用户选择 umask 占上风——如果程序不遵守我的 umask 设置,我会变得非常顽皮;在我发现并验证问题后,它往往不会再次使用。

shell 还有一个(内置)命令 umask 可以使用。 022 值是一个合理的默认值;大多数时候,您不希望任何人写入您的文件。

关于c - 为什么在 Linux 上使用 open 系统调用创建文件时会更改文件权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12489525/

相关文章:

linux - tslib 不创 build 备

linux - 使用 "sed"在 Redhat Linux 上查找和替换

c++ - 使用C或C++打印调用堆栈

c - 为什么在 SunOS 上调用 msgrcv 后得到“E2BIG”,但相同的代码在 Linux 上运行良好?

覆盖率警告 : :"cc" clobber ignored for htons() and ntohs()

c - 我需要有关优先级队列和搜索的程序的最佳实现的建议

java - 用于 java 的 Linux 字符串命令

c++ - 使用 Blink 作为前端布局引擎——从哪里开始?

c - "C"中的贪心算法

c - 使用函数修改结构体中字符串的内容