linux – mkdir()如何成功但设置了错误的权限?

linux – mkdir()如何成功但设置了错误的权限?,第1张

概述我有一个 Linux代码(用C语言编写)的问题是这样的: >使用成功的mkdir(“xyz”,0755)创建一个新目录(返回代码为0). >尝试在刚刚创建的目录中打开/创建新文件. >失败,因为新目录上的权限实际上是0600而不是0755. 代码如下所示,在进入此部分之前检查路径前缀“/ tmp / slim”是否存在: int somefunc(const string& path){ i 我有一个 Linux代码(用C语言编写)的问题是这样的:

>使用成功的mkdir(“xyz”,0755)创建一个新目录(返回代码为0).
>尝试在刚刚创建的目录中打开/创建新文件.
>失败,因为新目录上的权限实际上是0600而不是0755.

代码如下所示,在进入此部分之前检查路径前缀“/ tmp / slim”是否存在:

int somefunc(const string& path){  if ( mkdir( path.c_str(),0755 ) == 0 ) {    // (*) if (!access( path.c_str(),F_OK | R_OK | W_OK | X_OK ) == 0 )    // (*)   chmod( path.c_str(),0755);    string pIDinfo = to_string( getpID() ) + "\n";    string pIDinfofile = path + "/pID";    int fd = open( pIDinfofile.c_str(),O_RDWR | O_CREAT,S_IWUSR | S_IRUSR );    if ( fd == -1 )      return 0;    ssize_t written = write( fd,text.c_str(),text.size() );    // ... do more stuff  }}

由于这个strace片段(没有行丢失/编辑)显示,即使mkdir()返回0,openat()也会失败.

13661 16:32:22.068465 mkdir("/tmp/slim/testsock",0755) = 013661 16:32:22.068720 getpID()                = 1366113661 16:32:22.068829 openat(AT_FDCWD,"/tmp/slim/testsock/pID",O_RDWR|O_CREAT,0600) = -1 EACCES (Permission denIEd)

运行getfacl的结果如下所示:

[localhost]$getfacl /tmp/slim/getfacl: Removing leading '/' from absolute path names# file: tmp/slim/# owner: stk# group: stkuser::rwxgroup::r-xother::r-x

mkdir()如何返回0但是创建一个具有与指定权限不同的权限的目录?它不是一个umask的东西,我尝试在创建目录之前将umask设置为0而没有任何影响.如果标有(*)的两条注释行被启用/取消注释,那么事情就会发挥作用 – 但我不喜欢那种能够解决真正问题的症状治疗方法.对于这种看似奇怪的行为,必须有一个合理的解释.

故事的一部分是,这适用于具有多个线程的应用程序.每个线程执行上面的代码(这是一个小的,线程安全的函数),并且大多数线程成功,但总是1或2(5-10中)失败,如上所述.

解决方法 好吧,事实证明(并且非常期待,对吧?)正如@RobertHarvey也暗示的那样,这是一个线程问题.但我也有点正确:-)当我在评论中写道“某处存在一些隐藏的共享状态”.好吧,进程umask是一个共享的,但可能不是完全隐藏的状态/变量.这是出了什么问题:

>一个或多个线程正在执行上面的代码,愉快地创建目录.
>同时另一个线程正在摆弄umask以确保正在创建的Unix套接字的正确权限,暂时将umask设置为0177.
>尽管umask摆弄的时间太短,但Murphy的法律规定,目录有时是在umask为0177时创建的,同时也强制目录获得权限掩码0600而不是0755.

课程(重新)学习:使用多个线程时注意隐藏的共享状态/变量.

总结

以上是内存溢出为你收集整理的linux – mkdir()如何成功但设置了错误的权限?全部内容,希望文章能够帮你解决linux – mkdir()如何成功但设置了错误的权限?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1017376.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存