Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 文件权限不是';使用开放式系统调用无法正确设置_C_Linux_File Permissions_System Calls_Systems Programming - Fatal编程技术网

C 文件权限不是';使用开放式系统调用无法正确设置

C 文件权限不是';使用开放式系统调用无法正确设置,c,linux,file-permissions,system-calls,systems-programming,C,Linux,File Permissions,System Calls,Systems Programming,我目前正在研究“Linux编程接口”,在第4章中有一个练习,我们必须重写“tee”命令。我已经这样做了,但无论我做什么,我的文件权限(保存在mode\t类型的变量中)都没有正确设置 i、 我有这个代码: 说了这么多并做了这么多之后,目录中的文件将拥有由上述标志指定的权限rw-r--r--,而不是rw-rw 现在,我做了一些研究,它看起来像是传递给open()的mode参数指定了允许的最大权限数,然后它会在以后被更改(不知何故)。如果是这样,为什么会这样?为什么让我在开放调用中指定权限 如果有任

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

i、 我有这个代码:

说了这么多并做了这么多之后,目录中的文件将拥有由上述标志指定的权限
rw-r--r--
,而不是
rw-rw

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


如果有任何帮助,我将不胜感激,我希望继续阅读这本书,但这个问题有点令人沮丧,哈哈(我还没有在书中找到它的解释)。

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

更重要的是,有效的文件权限是由提供的标志和umask的值决定的

模式&~umask

检查案例中的umask设置为什么,您可能会得到问题的答案。此外,您还可以使用
umask()
syscall更改umask


有关更多信息,您可以阅读例如

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

请参阅
umask
。第15.4.6节是的,每个人都在说这是一件乌玛斯克的事情,我很高兴这会在书的后面解释。谢谢。O_CREAT只有在我们不追加的情况下才在flags变量中(程序允许-a选项,因此上面的三元内容决定了文件名是什么),但是它看起来确实是一个umask问题,很有趣。我想知道为什么它是这样设计的?
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.