質問: fopen("./temp.txt","a+"); if(flock(fileno(fp),LOCK_EX |LOCK_NB )!=EXIT_SUCCESS){ perror("Failed to flock(LOCK_EN)"); } ``` するプログラムを書いてみましたが、アンロックは成功しているのに ロックは”Resource temporarily unavailable”でエラーになります。
回答: `flock()`について誤解しています。ドキュメントには次の説明があります。 > > flock() によって作られるロックは、オープンファイル記述 (open file description) (open(2) 参照) と関連付けられる。 > > あるプロセスが open(2) (もしくは同様の方法) を使って同じファイルに対して複数のディスクリプターを取得した場合、 **flock() はこれら複数のディスクリプターを各々独立のものとして扱う。** これらのファイルディスクリプターの一つを使ってファイルをロックしようとした際、そのロック要求は、呼び出し元のプロセスがそのファイルの別のディスクリプター経由ですでに設定しているロックによって拒否される場合がある。 > > > `flock()`はファイルに対して関連付けられるのではなく、`fd`(オープンファイル記述)に関連付けられます。ということで、スレッドごとに`fopen()`してしまっては`flock()`は正しく機能しません。 > > > > > > flock()であるファイルのロックを取得したスレッドが不測の事態で落ちてしまったとき、ロックを解除するにはどうしたらよいでしょうか? > > > > > > > > > 不測の事態でスレッドが停止してしまった場合、それを検出したスレッドがロック解除すればそれまでのことです。もっともスレッドが停止してしまう状況で処理を継続させることにどれほどの意義があるかは疑問です。 なおドキュメントには次の説明もあります。 > > flock() アドバイザリロックだけを適用する。したがって、ファイルに適切なアクセス権を 付与していれば、プロセスは flock() の使用に無視して、ファイルへの入出力を行うことができる。 > > > `flock()`は`flock()`に対してのみ作用します。ロックを獲得できなくてもファイルアクセスは可能です。