使用 open 系统调用未正确设置文件权限

Posted

技术标签:

【中文标题】使用 open 系统调用未正确设置文件权限【英文标题】:File permissions aren't being set correctly using the open system call 【发布时间】:2014-01-03 03:48:29 【问题描述】:

我目前正在研究“Linux 编程接口”,在第 4 章中有一个练习,我们必须重写“tee”命令。我已经这样做了,但是无论我做什么,我的文件权限(保存在 mode_t 类型的变量中)都没有正确设置。

即,我有以下代码:

filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; // filePerms is mode_t
foutputFd = open((argc == 2) ? argv[1] : argv[2], flags, filePerms); // don't worry about the ternary here
if (foutputFd == -1)
  errExit("opening file %s", (argc == 2) ? argv[1] : argv[2]); // ...or here.

说到底,目录中的文件将拥有rw-r--r--而不是上述标志指定的rw-rw-rw权限

现在,我做了一些研究,看起来传递给open()mode 参数指定了允许的最大权限数,然后无论如何都会更改它(不知何故)。如果是这样,为什么会这样?为什么还要让我在公开调用中指定权限?

任何帮助都将不胜感激,我想继续阅读这本书,但这个问题有点令人沮丧,哈哈(我根本没有在书中找到解释)。

【问题讨论】:

umask。第 15.4.6 节 是的,每个人都说这是一个 umask 的东西,我很高兴稍后会在书中解释。谢谢。 【参考方案1】:

首先检查您在 flags 参数中传递的内容。只有当O_CREAT 标志被传递时,任何文件权限才会有一些结果。

有效的文件权限更多的是提供的标志和umask的值作为的结果

mode & ~umask.

检查您的案例中设置的 umask 是什么,您可能会回答您的问题。更重要的是,您可以使用umask() syscall 更改umask。

有关更多信息,您可以阅读例如open man page。

【讨论】:

O_CREAT 仅在我们不附加的情况下位于 flags 变量中(程序允许 -a 选项,因此上面决定文件名是什么的三元内容)虽然它似乎确实是一个 umask 问题,很有趣。我想知道为什么它是这样设计的?【参考方案2】:

此更改通常由umask 设置引起。如果您事先在 shell 中使用 umask 0 对其进行了调整,则此代码应该可以正常工作。

【讨论】:

以上是关于使用 open 系统调用未正确设置文件权限的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 Java 7 中未正确设置文件写入权限?

Rsync 未正确设置 Windows 文件夹的权限

mkfifo 文件权限未正确执行

Error+opening+hive+file+system.hive啥意思?

got未写入软件包数据

UNIX文件夹中设置的权限未正确传输到NFS共享