dポイントプレゼントキャンペーン実施中!

ファイルを読み書きする場合に使用するflockですが、closeする前に別ファイルのflockは使用できるのでしょうか?
テストしてみたところ、うまくいってるような気もするのですが、確証が持てないので質問させていただきました。

例)
$file1="file1.txt";
$file2="file2.txt";

open(OUT,"+<$file")
flock(OUT,2);
$count1=<OUT>;

open(DAT,"<$file2")
flock(DAT,1);
$count2=<DAT>;
close DAT;

$count=$count1+$count2;

truncate(OUT,0);
seek(OUT,0,0);
print OUT "$count ";
close OUT;

ちょっとあえて複雑な書き方としてみましたが、上記のようにflockを使ってる最中に別ファイルのflockを使用することは出来ますでしょうか?


参考URLでも結構ですので、どなたかよろしくお願いいたします。

A 回答 (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&s …
OSにファイルをロックする仕組みが予め備わっています。

デッドロックについては、これでも読んでください。
http://ja.wikipedia.org/wiki/%E3%83%87%E3%83%83% …

典型的な起こし方はこんな感じでしょう。
あなたが2つのプログラムを使っていて、プログラムAではfile1、file2の順でロックをとり、プログラムBではfile2、file1の順でロックを取ると、運が悪い時にデッドロックが置きます。
この状況では、プログラムAがfile1をロックした時にプログラムBが動き出し、file2をロックすることがありえますが、そうなるとプログラムAはfile2がアンロックされるのを待ち、プログラムBはfile1がアンロックされるのを待つので、どちらもアンロック待ちで止まってしまいます。

典型的な防ぎ方はロックの順序をすべてのプログラムで一定にすることです。
つまり、必ずfile1、file2の順で取るようにするなどします。そうすると、あとから来たのはfile1のロックを取れずに待っている間に先のプログラムは処理を完了させることができます。


まあ、一つのプログラムから複数のファイルを開いてロックを取れます。ただ、複数のロックを取る場合、デッドロックに気をつけてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。

参考URLも拝見させていただき、説明も丁寧にいただきまして、とても分かりやすく理解することが出来ました。

デッドロックについては初めて聞きましたので、この機会に勉強したいと思います。

丁寧に説明いただき、ありがとうございました。

お礼日時:2013/08/22 10:52

「flockを使ってる最中に別ファイルのflockを使用」できないなんて、ガセネタとしてすら一度も聞いたことがありませんね。

なぜそのような発想に至ったのか謎です。

何らかのファイルを開いている間に別なファイルを
「開ける」=「アクセスできる」=「ロックできる」
と考えてみれば、当たり前だと思いませんか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!