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

时间:2013-12-15 20:20:40

标签: c linux file-permissions system-calls systems-programming

我目前正在研究“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()模式参数指定了允许的最大权限数,然后无论如何它都会被改变(不知何故)。如果是这种情况,为什么会这样呢?为什么让我在公开电话中指定权限呢?

任何帮助都会受到赞赏,我想继续阅读这本书,但这个问题有点令人沮丧大声笑(我还没有在书中解释过它。)

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

更有效的文件权限是提供的标志和umask的值

的结果

mode & ~umask

检查你的案件中的umask是什么,你可能会回答你的问题。更重要的是,您可以使用umask()系统调用来更改umask。

有关详细信息,请参阅示例open man page