flockをいじってみた
flockが今借りてるサーバでも使えるようなので、ローカルで試しに組んでみることにした。
flock(HANDLE,$number);
のように使い、$numberは
- 1 : 読込で書込をロックして、あとから来たのは待機。
- 2 : 書込で書込読込をロックして、あとから来たのは待機。
- 5 : 読込で書込をロックして、あとから来たのには0を返す。
- 6 : 書込で書込読込をロックして、あとから来たのには0を返す。
- 8 : ロック解除。
- close()でもロックは解除される。
さしより1と2をつかえばいいわけか。
seekをつかって、書き込み途中で処理が入った場合、書き込み位置を調整する。
seek(HANDLE,$writepoint,$startpoint);
$writepointが書き込み開始位置で、$startpointが書き込みの位置指定。
- 0 : ファイルの最初
- 1 : 現在位置
- 2 : ファイルの終端
seek(HANDLE,0,2);
とすれば、その時点の終点にハンドル位置をもっていくため、実際に追加書き込みとなる。
su
password:
パス入力。
iキー。
#!/usr/bin/perl use strict; use warnings; use CGI; my $Count = 0; while($Count < 5){ open(DATA, ">>data.log"); flock(DATA,2); seek(DATA,0,2); print DATA "test$Count\n"; close(DATA); $Count ++ ; } open(DATA,"<data.log"); flock(DATA,1); my @DataLog = <DATA>; close(DATA); my $objCgi = new CGI; print $objCgi->header, $objCgi->start_html('sample'); foreach(@DataLog){ print $objCgi->p("$_"); } print $objCgi->end_html;
escキー。
:save sample1.pl
:quit
chmod 705 sample1.pl
ブラウザでアクセスすると、
test0
test0
.
.
.
と、延々書き続ける具合になった。途中リロードすると、test0のあとにtest4が混ざったりする。
あと、flockを使うとブラウザからのアクセスで権限を気を使う必要がなくなってたので、
su
password:
パス入力して、
chmod 777 CGI-Executables
exit
しといた。