什么会导致罕见的lchown()失败:不允许操作

时间:2012-06-23 02:12:04

标签: c++ symlink nfs

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

1 个答案:

答案 0 :(得分:1)

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