【Perl】ファイルロック(排他処理)について語ろう
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/06/23 10:18ID:eY2l+Gw10347nobodyさん
03/02/19 23:23ID:???0348山崎渉
03/03/13 17:22ID:???0350nobodyさん
03/03/22 18:02ID:???0351nobodyさん
03/04/17 00:56ID:s+I4ylgdhttp://www.din.or.jp/~ohzaki/perl.htm#File_Lock
を使おうと思ったんですが、
なにげにperl初心者なんで、その使い方がわかりません。
perlメモには、
$lfh = my_flock() or die 'Busy!';
# アンロックする
my_funlock($lfh);
$lfh にはなにをいれれればいいのでしょう?ファイル名?ファイルハンドル?
0352nobodyさん
03/04/17 02:26ID:???0353山崎渉
03/04/17 11:58ID:???0354351
03/04/17 22:16ID:PczzXVDVどういうこと?
0355佐々木健介
03/04/17 22:16ID:???/_ |
/. \ ̄ ̄ ̄ ̄|
/ / ― ― |
| / - - |
||| (5 > |
| | | ┏━┓| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | | ┃─┃| < こんなサイトを見つけた
|| | | | \ ┃ ┃/ \ 正直、スマンカッタ
| || | |  ̄ \_________
http://freeweb2.kakiko.com/tama/
0357bloom
03/04/17 22:56ID:ahUYqmP+0358nobodyさん
03/04/17 22:57ID:???0359あぼーん
03/04/17 23:23ID:???http://www.japan.pinkserver.com/yamazaki/saitama/hankaku06.html
http://www.japan.pinkserver.com/yamazaki/saitama/hankaku05.html
http://www.japan.pinkserver.com/yamazaki/saitama/hankaku03.html
http://www.japan.pinkserver.com/yamazaki/saitama/hankaku04.html
http://www.japan.pinkserver.com/yamazaki/saitama/hankaku01.html
http://www.japan.pinkserver.com/yamazaki/saitama/hankaku02.html
http://www.japan.pinkserver.com/yamazaki/saitama/hankaku09.html
http://www.japan.pinkserver.com/yamazaki/saitama/hankaku10.html
http://www.japan.pinkserver.com/yamazaki/saitama/hankaku07.html
http://www.japan.pinkserver.com/yamazaki/saitama/hankaku08.html
0361nobodyさん
03/04/19 13:00ID:EJZQKwDzに載ってる「ファイルを上書きする場合」(↓)
open(OUT, "+< $datafile"); # 読み書きモードで開く
flock(OUT, 2); # ロック確認。ロック
seek(OUT, 0, 0); # ファイルポインタを先頭にセット
print OUT "$data\n"; # 書き込む
truncate(OUT, tell(OUT)); # ファイルサイズを書き込んだサイズにする
close(OUT); # closeすれば自動でロック解除
を参考にして、
「(1)ファイルの中身(データ)を読み込んで、読み込んだデータを加工して、
(3)再度同じファイルにデータを格納する場合」を考えたんだけど、
↓で特に問題ないでしょうか?
$datafile = "data.txt";
open(OUT, "+< $datafile"); # 読み書きモードで開く
flock(OUT, 2); # ロック確認。ロック
@Array_data = <OUT>; # ★追加:(1)ファイルの中身を読み込んで
foreach $values (@Array_data){
#@Array_dataをいろいろ加工; # ★追加:(2)読み込んだデータを加工
chomp $values;
$values = $values * 2;
push (@New_Array_data,"$values\n");
}
seek(OUT, 0, 0); # ファイルポインタを先頭にセット
print OUT @New_Array_data; # ●変更:(3)再度同じファイルにデータを格納
truncate(OUT, tell(OUT)); # ファイルサイズを書き込んだサイズにする
close(OUT); # closeすれば自動でロック解除
0363nobodyさん
03/04/19 19:05ID:???この最中に逝っちゃっても大丈夫?
0365山崎渉
03/04/20 06:00ID:???( ^^ )< ぬるぽ(^^)
0366:
03/04/21 18:06ID:J93Hac+3http://sagatoku.fc2web.com/
あなたの探し物きっとみつかるよ☆^〜^★
0370nobodyさん
03/04/21 23:33ID:???0371nobodyさん
03/04/21 23:54ID:???イヤなら定期的にバックアップ取る処理を組め。
0372nobodyさん
03/04/22 14:19ID:???0373nobodyさん
03/04/22 20:26ID:???0374nobodyさん
03/04/22 20:41ID:???0375っていうか
03/04/24 13:03ID:???これ定説
0376山崎渉
03/05/22 02:08ID:???0377nobodyさん
03/05/22 07:17ID:???if (opendir(LOCK, "lock")) {
closedir(LOCK);
rmdir("lock");
# 処理
mkdir("lock");
}
0378nobodyさん
03/05/22 09:34ID:sAd9/kNTじゃなくて
mkdir("lock", 600)
でした。
0379nobodyさん
03/05/22 10:08ID:???違う。
if (mkdir ("lock", 755)) {
(処理)
}
こう。
mkdirは、ディレクトリの作成に成功すると真が、
失敗すると偽が返ってくる。
0380nobodyさん
03/05/22 13:35ID:2b2Zl4vP?それだけでいいんでふか?
0381nobodyさん
03/05/22 13:46ID:???そのときにネットで見つけたアダルトDVDショップ以前からオナニー用にDVD
が欲しかったのですぐ注文しました、とても安くてびっくりしましたが次の日には
もう届きました私が買ったのは、オナニー、レズ、レイプです毎日オナニーしてま
す。
http://www.net-de-dvd.com/
0382nobodyさん
03/05/22 13:53ID:???ttp://homepage1.nifty.com/glass/tom_neko/web/web_04.html
このへんでも参考に
0383380 じゃないけど
03/05/22 15:06ID:???激しく参考になりますた。謝謝。
ところで
flock() が使えないところで
eval{ if(!(flock(FH, 2))){ &function; } };
とした場合ちゃんとサブルチンに逝ってくれますか?
false は返ってくるんでしょうか?
0384nobodyさん
03/05/22 15:40ID:Mzhw6+0oサンクスコ(・∀・)
0385nobodyさん
03/05/23 13:24ID:ORCLTuvqアンロックする時にrmdirでディレクトリ削除ってことですよね?
>>382のサイト見てないけど…。
0387山崎渉
03/05/28 17:07ID:???ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
0388nobodyさん
03/05/28 18:03ID:???0389nobodyさん
03/05/31 21:04ID:n0OtuFEQ他のプロセスでロックしてるファイルにアクセスしてもロックがすぐ終っちゃうような…。
どうすれバインダー。
0390動画直リン
03/05/31 21:10ID:1EAhrEiJ0392389
03/05/31 21:45ID:n0OtuFEQ0393nobodyさん
03/05/31 22:08ID:nC5SP5sDロック中に
sleep 60;
0394nobodyさん
03/05/31 23:30ID:???package FileLock;
use IO::File;
my $CAT= '/bin/cat';
sub open_w {
my $filename= shift;
mkdir($filename)unless -d $filename;
my $base= sprintf("%s.%s.",time,$$);
my $cnt= 0;
$cnt++ while(-f "$filename/$base$cnt");
return IO::File->new("$filename/$base$cnt",'>>');
}
sub open_r {
my $filename= shift;
return IO::File->new("|$CAT $filename/*");
}
1;
0395nobodyさん
03/06/01 04:57ID:Hll/ZLYfおぉ!蟻がとう。
0398nobodyさん
03/06/01 21:54ID:???flockと組み合わせて(かつcron回してファイルをまとめつつ)
使ってたんだけど。。。駄目かぁ(´Д`;)
0399nobodyさん
03/06/02 00:36ID:???> mkdir($filename)unless -d $filename;
意味なし。複数のプロセスでunless -d $filenameが成立する可能性がある。
排他制御するにはアトミックにやらないと駄目。
排他制御に強い/弱いは無い。正しいか駄目のどちらか一方、わずかでも可能性があれば駄目ロック。
0400nobodyさん
03/06/02 09:59ID:7y9vki3n--$retry <= 0
なんてやってるの?
$retry--
じゃまずいの?
0401nobodyさん
03/06/02 10:09ID:Ixodm31chttp://www1.free-city.net/home/s-rf9/page006.html
0402nobodyさん
03/06/02 10:20ID:sw1UrgM5( ´∀`)/< 先生もろDVDはどこですか?
_ / / / \___________
\⊂ノ ̄ ̄ ̄ ̄\
||\ \
||\|| ̄ ̄ ̄ ̄ ̄||
|| || ̄ ̄ ̄ ̄ ̄|| ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
.|| || (´Д` ) < http://www.dvd01.hamstar.jp だ!
/ \ \___________
|| ||
|| ||
__ //_ //___
/ // // /
/  ̄  ̄ //
|| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ||
|| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ||
|| 教卓 || ||
|| ||
0404nobodyさん
03/06/02 10:35ID:azLkJHuzいやいや、なんで<=を使ってるかが知りたいの?
ifって偽だと実行しないでしょ?
$retryは最終的に0になるわけだから、<=は必要ないだろ。
ってかスレ違いって分かってるので、逝ってきます。
0405nobodyさん
03/06/02 10:39ID:7y9vki3nやっぱり逝くしかないな…。
0406直リン
03/06/02 11:10ID:mGHfwiJV0409nobodyさん
03/06/02 12:07ID:???いや・・・だからさ・・・
全体のソース読んでないんで分からないんだけど。
マイナスになる可能性があるかもしれないんでしょ?
--$retry <= 0
この条件だと、$retryがもし0だったら・・・
-1 <= 0
こんな判定になるし。
0が入る訳がないソースだったとしても、
ちゃんと条件書いてる方が、見た目分かりやすいってのもある。
そして、スレ違いだから、やっぱ逝くべき。
0412nobodyさん
03/06/02 12:47ID:YkiHze2nうおっ!キツイ一言だな…。
でもこのスレのヤシらはなんか優しい…。
すっきりしたら逝くから、すっきりさせろYO!
なんで-1になるんだ?
粘着房だな…。
0413nobodyさん
03/06/02 13:02ID:???だから・・・・
--$retry <= 0
↑これだけ見せられて、-1になるか、ならないかって言われても、
分からない訳なのよ。
どのソースみて、言ってる訳?
とにかく、その一行を見る限りでは、-1になる可能性はある。
何度も言うようにスレ違いだから、優しいうちに逝っとけ。
0414動画直リン
03/06/02 13:10ID:mGHfwiJV0416nobodyさん
03/06/02 13:43ID:???気がするであって、気にする奴が本当に気にしなきゃいけない場合はアセンブラで書く。
0417_
03/06/02 14:38ID:???0418_
03/06/02 16:09ID:???0419_
03/06/02 19:13ID:???0421nobodyさん
03/06/17 05:57ID:???これって使っても平気ですか?
0422nobodyさん
03/06/22 16:13ID:???0423nobodyさん
03/07/07 19:32ID:???20 Open "Text1.txt" For Output As #1
30 Print #1,"Write file."
40 Close #1
ファイルロックのためのtmpファイル作成しようと思ったんですが、
プログラム内で擬似マルチタスクを作成している時といないときがあるので、
flock関数みたいなものがあれば効率が上がると思うのですが、
やはりrename形の方が安全で軽いのでしょうか?
0424なぞなぞ先生
03/07/08 06:24ID:???0425nobodyさん
03/07/08 12:02ID:???0427nobodyさん
03/07/08 12:19ID:???0428nobodyさん
03/07/08 15:54ID:???0429nobodyさん
03/07/08 15:58ID:???0431nobodyさん
03/07/10 16:21ID:QDkm5VXPflock使えるサーバなんだけど、書き込み中はロックするっていう
対象のファイルをflockの引数にするのと、別のダミーファイルを
flockの引数にするのとあるでしょ。どっちがいいのでつか。
0432nobodyさん
03/07/10 17:46ID:???処理全体にかけたいなら後者の方が良いかと。
0433nobodyさん
03/07/10 21:42ID:???0435nobodyさん
03/07/11 11:17ID:???0437なぞなぞ先生
03/07/15 06:43ID:???完全に同時にプロセスが発生することはないよね?
マルチタスクってのもマルチスレッドってのも基本的に擬似的に行っているもので、
結局は1つのプロセスが司っている処理って聞いたことがあったような。
そうすると、OSがダウンしない限りrename型の排他処理
rename
open
処理
close
rename
は完璧に有効だと思うんだが。
と思ったけど、それを言い始めたらキリが無いかw
うーん、、、しかしたまに2chで1001を超えるのは何でだろう。
ロック解除してから1001のチェックをしているのかな。。。
最近うなされて困ってます。変な文&長文すまん。
0438nobodyさん
03/07/15 06:44ID:???氏のう。。。。
0439山崎 渉
03/07/15 11:08ID:???__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
0440nobodyさん
03/07/15 19:03ID:???レスが1000を超えるのはdatファイルへの書き込みと、
レスポンス数のチェック(書き込み禁止処理)がアトミックにできないから。
実際には、二つの処理に結構な間があると思う。
0441nobodyさん
03/07/15 22:40ID:???| |
∧_∧ | | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ´ー`)// < 先生!
/ / | アトミックって何ですか?
/ /| / \___________
__| | .| | __
\  ̄ ̄ ̄ ̄ ̄ \
||\ \
||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
|| || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
.|| ||
0442nobodyさん
03/07/15 23:25ID:???他のプロセスが割り込めない極小時間(ワンステップ)で操作。
にしといてくださいな。
0443nobodyさん
03/07/16 07:27ID:???ましてやファイルロックの話題ならなおさら
0444437
03/07/16 08:09ID:???ファイルロック中に何らかの処理(たとえば別ファイルにHTML書き出しやHTML化待ちDATリストへの追加)
をすれば、"アトミック"は存在しないと思うのですが。
下手な考えスマソ。。。
0445440
03/07/16 22:09ID:???ああっと、flockが頭にあったので、、
renameが理想的なロックとして動作するとしたら>>437で可能だと思います。
(OSがlinuxの場合は壊れたりするけど…)
2chとしては、1000で止まらなくても(多少レスが多く付いても)構わないのかも。
(ロックする時間が増える→待ちプロセス数が増える→サーバ負荷が増えるよりは。)
0446437
03/07/17 00:22ID:???2chみたいな大規模な掲示板だとここが問題なんですね。
ぐっすり眠れそうな気がしました。レスありがとうございました。
■ このスレッドは過去ログ倉庫に格納されています