使用 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 系统调用未正确设置文件权限的主要内容,如果未能解决你的问题,请参考以下文章