flockの使い方について。

[上に] [前に] [次に]
じぇい 1999/05/20(木) 00:58:17
open(OUT,"$guest");
 flock(OUT,2);
  while (<OUT>) {
   print;
  }
 flock(OUT,8);
close(OUT);

このような処理を見かけたのですが、flock(2,...);と、flock(1,...);の使い分けがわかりません。flock(1,...);というのは一体どのような場面で使うのでしょうか?

あと、追加書きこみをするときにflockを使いたい場合の正しい使い方を教えてください。

じぇい 1999/05/20(木) 01:41:49
すいません。訂正です。
flock(...,2);とflock(...,1);です。^^;

B-Cus 1999/05/20(木) 03:00:24
http://www.tohoho-web.com/wwwperl2.htm#flock

じぇい 1999/05/20(木) 03:40:00
あっ、、一応そこは読んだのですが、はっきりとわからなかったので質問してみました。
読みこみ宣言ロックと言うのは別に読みこむときにするものとは限らないのでしょうか?、、というか読みこみ処理が同時に行われてファイルが壊れるというようなことはあるのでしょうか?
もし、そういう可能性がないならばファイル読み込み時には読み込み宣言ロックを行えばよいということですよね?
初めの質問で載せた例では読み込み時に書きこみ宣言ロックを行っていたのでどうなのだろう、、と思いました。

あと、追加書きこみの時のflockの使い方なのですが、

    open(OUT, ">> outfile.txt");
    flock(OUT, 2);
    truncate(OUT, 0);
    print OUT "........";
    close(OUT);

これでいいんですか、、?(わからかったので、結構適当です。^^;)

なえ 1999/05/20(木) 08:52:35
読み込みロックを掛けると、他の処理はそのファイルを読むことはできるけど書き込むことはできない。
書き込みロックを掛けると、他の処理はそのファイルを読むことも書き込むこともできません。
で、読み込みが同時に行われてファイルが壊れるということは普通はありえません。

それから追加書き込み時は、truncateはいらないです。
truncateはファイルのサイズを切り詰める関数です。

じぇい 1999/05/20(木) 15:25:28
なるほど。
、、、ということは初めに出した例は書いた人の誤りだったということでしょうかね、、、?
ちなみに追加書きこみのときは普通にflock(2, ...);とflock(8,...);を使えばいいと言うことですか?

じぇい 1999/05/20(木) 15:27:21
また間違えました。^^;

追加書きこみのときは、

open(OUT, ">> outfile.txt");
flock(OUT, 2);
print OUT "........";
flock(OUT, 8);
close(OUT);

でいいんですか?

なえ 1999/05/20(木) 16:31:05
最初の例は、間違いというよりその人が面倒くさがりで、
全てのロックを書き込みロックにしてるんじゃないでしょうか?
よっぽどアクセス数の多いCGIでもなければ、
全てflock(**, 2)にしちゃって良いと思います。

>open(OUT, ">> outfile.txt");
>flock(OUT, 2);
>print OUT "........";
>flock(OUT, 8);
>close(OUT);
flock(OUT, 8);はいらないです。
ファイルをcloseすれば勝手にロック解除されます。

じぇい 1999/05/20(木) 20:12:56
[[解決]]
あっ、、勝手にロック解除されるんですか、、、。
どういう仕組みなんでしょうかね、、、。
どうもありがとうございました。m(_ _)m

mo [E-Mail] 1999/05/21(金) 10:28:51
flock(OUT, 2); の直後に
seek(OUT, 0, 2);
が必要です。ロック中に他の CGI がデータを追加している可能性がある
からです。

じぇい 1999/05/21(金) 23:00:15
どうもありがとうございます。
追加しておきます。

[上に] [前に] [次に]