我有一个 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 机器上运行的。
“pathnameToFile”存在于 NFS 安装分区上。正在创建的文件和指向它的链接之间是否存在某种竞争条件,并且 lchown 失败是因为 NFS 尚未反射(reflect)它的存在?
然而,过了一段时间后,符号链接(symbolic link)出现了,尽管 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 是“我”的主要组,另一个组是“轮子”。
> groups
me wheel
这是一个竞争条件,当 lchown 失败时添加一个短暂的 sleep ,然后重试。
我是一名优秀的程序员,十分优秀!