我对 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