1

我对 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”的符号链接也未能在我的应用程序中创建它,但代码未检测到任何错误(以下返回0):

::symlink("pathnameToFile", "linkToPathname");

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

“pathnameToFile”存在于 NFS 挂载的分区上。正在创建的文件和指向它的链接和 lchown 之间是否存在某种竞争条件,因为 NFS 还没有反映它的存在?

然而,经过一段时间后,符号链接出现了,尽管 chown 仍然无效。

“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

gid 500 是“me”的主要组,另一组是“wheel”。

> groups
me wheel
4

1 回答 1

1

这是一个竞争条件,当 lchown 失败时添加一个短暂的睡眠并重试。

于 2012-06-23T18:29:13.390 回答