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

我有一个

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) = 0

13661 16:32:22.068720 getpid() = 13661

13661 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: stk

user::rwx

group::r-x

other::r-x

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值