![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
ファイルを読み書きする場合に使用する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ランキング
-
CGI のモジュールをつかってフ...
-
FindFirstFileとFindNextFileで...
-
ExcelをCSV書き出す場合のシー...
-
Windowsで複数のファイルを同じ...
-
htaccessで特定のディレクトリ...
-
perlで、後ろの行を読んで、前...
-
重複ファイル名ある場合ファイ...
-
DOSコマンドで、標準出力を出力...
-
Perl初心者です。同一データを...
-
window.open でのファイル指定方法
-
全角と半角文字が混在している...
-
perlにて2つのファイル比較
-
perlのflock関数でロックをかけ...
-
Net::FTPを使いファイル一覧の...
-
HTMLのフォームで画像と文...
-
テキストファイルから日本語部...
-
データファイルからのデータの...
-
perlのエディタでおすすめを教...
-
外部サーバーにあるファイルを...
-
INPUTデータを分割したい!
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fopenでディレクトリ内の全ファ...
-
ファイルロックの解除方法
-
TSVファイルを読み込んでCSV形...
-
[perl] perlで書き込み中に、PC...
-
Cookieが保存できない。
-
最新のファイルのみ検索
-
perlをデスクトップのショート...
-
ファイルの結合
-
perlでCSV形式ファイルのア...
-
unixでのファイルロックの方法...
-
flockについて
-
ファイルがオープンできない
-
CGI のモジュールをつかってフ...
-
fortranでプログラムを作りたい...
-
CGIでhtml出力部分(print、ヒア...
-
ファイルディスクリプタとは?
-
ファイルの存在確認をしたい
-
HTMLの中にCGIファイルリンク
-
file_exists関数について
-
1行がやたら長いテキストをバッ...
おすすめ情報