![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
ファイルを読み書きする場合に使用する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でも結構ですので、どなたかよろしくお願いいたします。
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&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のロックを取れずに待っている間に先のプログラムは処理を完了させることができます。
まあ、一つのプログラムから複数のファイルを開いてロックを取れます。ただ、複数のロックを取る場合、デッドロックに気をつけてください。
ありがとうございます。
参考URLも拝見させていただき、説明も丁寧にいただきまして、とても分かりやすく理解することが出来ました。
デッドロックについては初めて聞きましたので、この機会に勉強したいと思います。
丁寧に説明いただき、ありがとうございました。
No.1
- 回答日時:
「flockを使ってる最中に別ファイルのflockを使用」できないなんて、ガセネタとしてすら一度も聞いたことがありませんね。
なぜそのような発想に至ったのか謎です。何らかのファイルを開いている間に別なファイルを
「開ける」=「アクセスできる」=「ロックできる」
と考えてみれば、当たり前だと思いませんか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl perlのflock関数でロックをかけたままopen関数で何度もファイルを開きなおすことはできますか 3 2023/05/01 22:25
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- その他(プログラミング・Web制作) pythonのエラーについて 2 2022/08/17 17:17
- C言語・C++・C# [至急]Project Euler:#17Number letter countsコード入力出力解説 2 2022/09/24 02:46
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- Ruby パイソンエラーについて 1 2022/12/24 14:07
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TSVファイルを読み込んでCSV形...
-
Cookieが保存できない。
-
エクセルVBA コードが同じでも...
-
ExcelをCSV書き出す場合のシー...
-
空白文字 \\f と\\v の違いに...
-
python renameについて
-
batファイルでrenameができませ...
-
Perlで特定行から特定行までを...
-
HTTP::Request::Common qw(POST...
-
close()で例外が投げられる理由
-
openした後、closeしないでプロ...
-
VBAでCSVファイルの特定行を書...
-
バッチファイルの作り方(CSV→...
-
Pythonでegrep機能をつかいたい
-
パスから最後のディレクトリだ...
-
複数ファイルの読み込みについて
-
csvで順番の入れ替え
-
ifstream を利用した1行分のテ...
-
教えて!perlから.exeファイル...
-
Perlの初心者です。2重ループ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fopenでディレクトリ内の全ファ...
-
unixでのファイルロックの方法...
-
ファイルロックの解除方法
-
printscreenについて。
-
Cookieが保存できない。
-
画像アップロード機能を追加し...
-
CGI二重起動防止ロック処理
-
HTMLの中にCGIファイルリンク
-
VBでファイル分割の方法
-
1行がやたら長いテキストをバッ...
-
flockについて
-
ファイルがオープンできない
-
FC2サーバーでのCGI設置方法に...
-
CGIでhtml出力部分(print、ヒア...
-
DBの環境変数について
-
ファイルディスクリプタとは?
-
[perl] perlで書き込み中に、PC...
-
VBAでCSVファイルを途中行まで...
-
awkスクリプトでダブルクォーテ...
-
VBAでCSVファイルの特定行を書...
おすすめ情報