ほとんどの実行で合格するC++コードのテストがありますが、まれに、テスト対象のアプリケーションでlchown()が呼び出されて失敗し、errnoEPERMと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");
この2つは関連していると思います。これは、32ビットのCentos4マシンで実行されています。
「pathnameToFile」はNFSマウントされたパーティションに存在します。作成中のファイルとそのファイルへのリンクの間に何らかの競合状態があり、NFSがまだその存在を反映していないためにlchownが失敗する可能性がありますか?
しかし、しばらくすると、チャウンは効果がないままでしたが、シンボリックリンクが表示されました。
「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」のプライマリグループであり、もう1つのグループは「wheel」です。
> groups
me wheel