• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:flockについて)

flockについての質問

このQ&Aのポイント
  • ファイルを読み書きする場合に使用するflockですが、closeする前に別ファイルのflockは使用できるのでしょうか?
  • openとflockの使用例として、ファイルの読み書きと同時にflockを行う方法を試しましたが、確証が持てません。
  • flockを使用する中で、別のファイルのflockを使用することはできるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

> ファイルを読み書きする場合に使用するflockですが、closeする前に別ファイルのflockは使用できるのでしょうか? はい。できます。 ただ、デッドロックをしないように気をつけてください。 flockによるロックはファイルごとに設定されるので、一つのプログラムから複数のファイルを開き、それぞれにflockを発行することができます。 ちなみに、後述するドキュメントによると、OSがflockをサポートしている環境では、perlのflockはOSのファイルをロックする仕組みを呼び出し、そのファイルを独占します。一応、知っているとは思いますが、共有ロックでのflock中に別のプログラムが排他ロックをかけると、共有ロックがはずされるまでそのプログラムは待たされます。排他ロック中に他のプログラムが排他ロックをかけると、そのプログラムは排他ロックがはずされるまで待たされます。なお、ファイルのロックはファイルをcloseした時か、プログラムの実行が修了した時に自動的にアンロックされるので明示的にアンロックをする必要はありません。 参考URLとなると、これでしょうか。 Perlのflock関数についての説明です。 http://perldoc.perl.org/functions/flock.html (和訳) http://perldoc.jp/func/flock このflock(2)というのは例えばこれですね。 http://www.freebsd.org/cgi/man.cgi?query=flock&sektion=2 OSにファイルをロックする仕組みが予め備わっています。 デッドロックについては、これでも読んでください。 http://ja.wikipedia.org/wiki/%E3%83%87%E3%83%83%E3%83%89%E3%83%AD%E3%83%83%E3%82%AF 典型的な起こし方はこんな感じでしょう。 あなたが2つのプログラムを使っていて、プログラムAではfile1、file2の順でロックをとり、プログラムBではfile2、file1の順でロックを取ると、運が悪い時にデッドロックが置きます。 この状況では、プログラムAがfile1をロックした時にプログラムBが動き出し、file2をロックすることがありえますが、そうなるとプログラムAはfile2がアンロックされるのを待ち、プログラムBはfile1がアンロックされるのを待つので、どちらもアンロック待ちで止まってしまいます。 典型的な防ぎ方はロックの順序をすべてのプログラムで一定にすることです。 つまり、必ずfile1、file2の順で取るようにするなどします。そうすると、あとから来たのはfile1のロックを取れずに待っている間に先のプログラムは処理を完了させることができます。 まあ、一つのプログラムから複数のファイルを開いてロックを取れます。ただ、複数のロックを取る場合、デッドロックに気をつけてください。

hana43
質問者

お礼

ありがとうございます。 参考URLも拝見させていただき、説明も丁寧にいただきまして、とても分かりやすく理解することが出来ました。 デッドロックについては初めて聞きましたので、この機会に勉強したいと思います。 丁寧に説明いただき、ありがとうございました。

その他の回答 (1)

回答No.1

「flockを使ってる最中に別ファイルのflockを使用」できないなんて、ガセネタとしてすら一度も聞いたことがありませんね。なぜそのような発想に至ったのか謎です。 何らかのファイルを開いている間に別なファイルを 「開ける」=「アクセスできる」=「ロックできる」 と考えてみれば、当たり前だと思いませんか?