flock(1,2)ってどういう意味?

[上に] [前に] [次に]
SRI 2000/06/02(金) 19:36:11
エーアイ出版「最新HTML&CGI入門」という本で勉強しています。
flock(ファイルハンドル, 指令)という関数を使う前に、試しで、
#! /usr/bin/perl
eval flock(1, 2);
print $@;
というプログラムを使って、なにも文句を言わなかったら使って
みましょう(flockを使えないシステムもあるので)的なことが
書いてありました。
$@は別の本(ラクダ)で直前のevalでエラーがあるとメッセージが
入るということで大方の意味がわかったんですが、
「flock(1,2)」でなんでエラーにならないんでしょうか?
第1引数はファイルハンドルですよね? でも数字でもいいの?
「ファイルハンドル」が何かわからずに書いていますが (^^;
ということでよろしくお願いします。

SRI 2000/06/02(金) 20:20:20
で、さっそく実験してみたんですが、うまくいきません。
(上のテストはうまくいきました)
flock を使ってロックを掛けようと思い、

open COUNT, "count.txt";
flock COUNT, 2;
$count = <COUNT>;
close COUNT;
sleep 10; # 二重更新の実験用一時停止
open COUNT, ">count.txt";
print COUNT, ++$count;
flock COUNT, 8;
close COUNT;
以下カウントの表示、、

というプログラムで、ブラウザを2個起動し、
次々にブラウザを押しましたが、
両方同じカウントになってしまいます。
なんか使い方マズいでしょうか?
よろしくお願いします、、。

hrrh 2000/06/02(金) 21:09:29
flockはcloseすると自動的に解除されるので、
closeせずに、入出力共用モードでファイルを開き、
書き込み前にseekしてファイルポインタを先頭に
持ってくるといいと思います。

SRI 2000/06/02(金) 23:14:51
>hrrh さん
ばっちりでした! ありがとうございます。

open COUNT, "+<count.txt";
flock COUNT, 2;
$count = <COUNT>;
seek 0,0;
sleep 10; # 二重更新の実験用一時停止
print COUNT, ++$count;
flock COUNT, 8;
close COUNT;
以下カウントの表示、、

なお、flock(1,2) の意味は引き続き募集します。(_ _)

バギンズ 2000/06/03(土) 03:19:05
>「flock(1,2)」でなんでエラーにならないんでしょうか?
勘違いしてますね。
evalは致命的エラーのチェックをする関数です。
そして、致命的エラーが発生すると$@にエラーメッセージがセットされます。

>eval flock(1, 2);
を行った場合、flockが使えるかどうか(flockを実装しているかどうか)を調べ、
flockが使えない場合(flockを実装していない場合)は
エラーメッセージが$@に入ります。
flockのリターンが$@に入るわけではありません。

もし、flockのリターンを取りたいなら
eval { $lockrtn = flock(1, 2); };
って感じで、ちゃんと変数に代入してとらないといけません。

SRI 2000/06/03(土) 10:29:55
[[解決]]
なるほど! 納得です。
どうもありがとうございました。
これにて一件落着ー。

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