我目前正在研究“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()
的模式参数指定了允许的最大权限数,然后无论如何它都会被改变(不知何故)。如果是这种情况,为什么会这样呢?为什么让我在公开电话中指定权限呢?
任何帮助都会受到赞赏,我想继续阅读这本书,但这个问题有点令人沮丧大声笑(我还没有在书中解释过它。)
答案 0 :(得分:3)
此更改通常由umask
设置引起。如果您事先使用umask 0
在shell中对其进行了调整,则此代码应按预期工作。
答案 1 :(得分:0)
首先检查你在flags参数中传递的内容。只有在传递O_CREAT
标志时,任何文件权限都会产生一些结果。
更有效的文件权限是提供的标志和umask的值
的结果 mode & ~umask
。
检查你的案件中的umask是什么,你可能会回答你的问题。更重要的是,您可以使用umask()
系统调用来更改umask。
有关详细信息,请参阅示例open man page。