我对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):< / p>
::symlink("pathnameToFile", "linkToPathname");
我想这两件事是相关的。这是在32位Centos 4计算机上运行。
NFS安装的分区上存在“pathnameToFile”。在创建的文件和它的链接之间是否存在某种竞争条件,并且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
答案 0 :(得分:1)
这是一种竞争条件,当lchown失败时添加一个短暂的睡眠,然后重试。