我已经对大多数运行中的C++代码进行了测试,但是在少数情况下,由于在测试中的应用程序中对lchown()的调用而失败,并因errno EPERM和strerror失败:

Operation not permitted.

我的应用程序中有问题的代码如下:
::lchown("pathnameToFile", uid_t(500), static_cast<unsigned>(-1)); // This line works
::lchown("pathnameToFile", static_cast<unsigned>(-1), gid_t(500)); // This fails rarely

同样在失败的测试用例迭代中,先前创建指向“pathnameToFile”的符号链接(symbolic link)的尝试也未能在我的应用程序中创建它,但是代码未检测到任何错误(以下返回0):
::symlink("pathnameToFile", "linkToPathname");

我想这两件事是相关的。它在32位Centos 4机器上运行。

NFS安装的分区上存在“pathnameToFile”。由于NFS尚未反映出其存在,因此正在创建的文件与指向该文件的链接之间可能存在某种竞争状况,并且lchown失败了吗?

但是,经过一段时间后,尽管链条仍然没有作用,但仍出现了符号链接(symbolic link)。

“pathnameToFile”位于具有权限的目录中:
drwxrwxr-x   2 me me   4096 Jun 22 17:33 .
-rw-rw-r--   1 me root   33 Jun 22 17:33 pathnameToFile
lrwxrwxrwx   1 me root    8 Jun 22 17:33 LinkToPathname -> pathnameToFile

向导500是“我”的主要组,另一组是“车轮”。
> groups
me wheel

最佳答案

这是一种竞赛情况,当lchown失败时请增加一小段睡眠,然后重试。

关于c++ - 可能导致罕见的lchown()故障的原因:不允许进行操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11166236/

10-11 16:29