gpt4 book ai didi

调用 open(2) 忽略 S_IWGRP 和 S_IWOTH 标志

转载 作者:太空宇宙 更新时间:2023-11-04 08:12:17 26 4
gpt4 key购买 nike

S_IWGRPS_IWOTH 标志在 open(2) 中指定时没有任何效果。

文件打开并创建为

open(file,O_CREAT|O_WRONLY,S_IWGRP|S_IWOTH);  

导致

---------- 1 root root 0 Jul 16 21:25 file  

任何其他标志都可以正常工作。

我应该从哪里开始进行故障排除?

最佳答案

您需要考虑流程 umask值(value)。参见 man 2 umask .

umask 值是从给予 open(2) 的权限掩码中减去的.也就是说,如果你做 open(file,O_CREAT|O_WRONLY,mymask)然后实际掩码不是 mymask但是mymask & ~umask .

大多数用户以 022 的 umask 值开始[八进制],即 S_IWGRP | S_IWOTH .

用户的 umask 值可以通过 shell 内置命令控制 umask .

进程可以通过 umask(2) 更改 umask 值系统调用。在你的情况下,尝试:

oldval = umask(0);
open(...);
umask(oldval);

注意:这在单线程环境中工作正常,但在多线程程序中应该采取额外的步骤。

另一种方法是使用 fchmod :

fd = open(...);
fchmod(fd,mymask);

这对于多线程来说可能更安全,但是如果程序在 open 之间中止但在 fchmod 之前,您最终会遇到与您相同的情况(例如零掩码)。所以,一个 <CTRL-C> 、系统崩溃等适时产生。


更新:

I'm confused about it because when I'm printing the real value of S_IRWXU flag I get an 442. Why it is not just a number 7

我不是很确定,因为我不知道 442是十进制或八进制,但我会尝试涵盖所有基础 [双关语:-)]。

权限掩码的布局,通常以八进制打印[ "%o"格式]是:

owner(3) | group(3) | other(3)

即每个都是3位宽

S_IRWXU define 是针对“所有所有者 权限”的固定定义。它的八进制值为 700这是 448十进制。所以,如果你正在做 printf("%d\n",S_IRWXU)我希望 448

printf("%d\n",mask & S_IRWXU) [甚至printf("%d\n",mask & S_IRWXU) ] 不能产生442因为那个十进制值是八进制的 672 . 672会被掩盖到 600八进制或 384十进制。但是,这是不可能的。

所以,如果小数值真的 448并且不是 442 , 这会产生 700八进制表示“所有者拥有所有权限”

所以,对我来说唯一有意义的是 442整个 权限掩码的八进制值[并且被屏蔽为 777八进制]。

为了澄清,这里是 stat.h 的文件片段定义各种值[评论是我添加的]:

#define S_IRWXU 00700       // mask for owner
#define S_IRUSR 00400 // owner may read
#define S_IWUSR 00200 // owner may write
#define S_IXUSR 00100 // owner may execute

#define S_IRWXG 00070 // mask for group
#define S_IRGRP 00040 // group may read
#define S_IWGRP 00020 // group may write
#define S_IXGRP 00010 // group may execute

#define S_IRWXO 00007 // mask for others
#define S_IROTH 00004 // others may read
#define S_IWOTH 00002 // others may write
#define S_IXOTH 00001 // others may execute

所以,442r|r|w它说所有者和组可以读取而其他人可以写入[但不能读取]。这对于给定的 文件 没有多大意义,因此这意味着有问题的掩码是 umask值(value)。但是,即便如此,这仍然没有多大意义,因为作为 umask值,删除所有者的读取权限不是通常要做的事情。

注意 S_IRWXU00700 ,所以如果你将它右移 6,你得到 7 .同样,S_IRWXG00070 ,所以如果右移 3,你也会得到 7

更有可能的是,您要屏蔽的值是 S_IRWXG | S_IRWXO [group/others] 因为这是您在原始问题中试图覆盖的内容。

如果您仍然遇到问题,并且可以进一步阐明您为获得值(value)所做的工作,我可以进一步修改它以提供帮助。

关于调用 open(2) 忽略 S_IWGRP 和 S_IWOTH 标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38415421/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com