トップページ⇒php
981コメント337KB

【Perl】ファイルロック(排他処理)について語ろう

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/06/23 10:18ID:eY2l+Gw1
どんな環境でも使えて、軽くて、頑丈なロックを考えようじゃありません
0348山崎渉03/03/13 17:22ID:???
(^^)
0349nobodyさん03/03/13 22:46ID:???
>>329
ログの閉じミスなんて気にしなくても。。。
0350nobodyさん03/03/22 18:02ID:???
どうせさほどアクセスが多いところじゃないんだろうから、mkdirと強制ロック解除のパターンでいいじゃん。
0351nobodyさん03/04/17 00:56ID:s+I4ylgd
Perlメモの
http://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:???
(^^)
035435103/04/17 22:16ID:PczzXVDV
>>352
どういうこと?
0355佐々木健介03/04/17 22:16ID:???
     ______
    /_      |
    /. \ ̄ ̄ ̄ ̄|
  /  /  ― ― |
  |  /    -  - |
  ||| (5      > |
 | | |     ┏━┓|   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | |     ┃─┃|  < こんなサイトを見つけた
|| | | |  \ ┃  ┃/    \  正直、スマンカッタ
| || | |    ̄         \_________
http://freeweb2.kakiko.com/tama/
0356nobodyさん03/04/17 22:26ID:???
>>354
なにげにが気に入らないから教えない
0357bloom03/04/17 22:56ID:ahUYqmP+
http://www2.leverage.jp/start/
0358nobodyさん03/04/17 22:57ID:???
なんでDB使わないの?
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
0360nobodyさん03/04/18 23:20ID:???
>>358
一回使ったらまた集めなきゃならないだろ。
0361nobodyさん03/04/19 13:00ID:EJZQKwDz
http://homepage1.nifty.com/glass/tom_neko/web/web_04.html
に載ってる「ファイルを上書きする場合」(↓)
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すれば自動でロック解除


0362nobodyさん03/04/19 15:13ID:???
>>361
うん、これで問題ないね
0363nobodyさん03/04/19 19:05ID:???
> ★追加:(2)読み込んだデータを加工
この最中に逝っちゃっても大丈夫?
0364nobodyさん03/04/19 19:45ID:???
>>363
途中でプロセスが死んだらどんなことしたって壊れるときは壊れる
0365山崎渉03/04/20 06:00ID:???
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
0366:03/04/21 18:06ID:J93Hac+3
☆^〜^★ 50音順で探せて楽して得する
http://sagatoku.fc2web.com/
   あなたの探し物きっとみつかるよ☆^〜^★
0367nobodyさん03/04/21 21:46ID:???
>>364
駄目じゃん
0368nobodyさん03/04/21 22:35ID:???
>>367
たかが趣味でやってるCGIのデータなんだから気にしすぎ
壊れたらどうやって対処するかスキルを身に付けるいいチャンス
0369nobodyさん03/04/21 23:09ID:???
>>368
そういう誤魔化し方は好きじゃないな
0370nobodyさん03/04/21 23:33ID:???
書いてる途中で死んでもジャーナルファイルシステムの恩恵にあずかれたりしない?
0371nobodyさん03/04/21 23:54ID:???
どんなことしても、壊れる物は壊れる。
イヤなら定期的にバックアップ取る処理を組め。
0372nobodyさん03/04/22 14:19ID:???
突然死するトランザクションは救えないが、DBが壊れないようにすることは可能。
0373nobodyさん03/04/22 20:26ID:???
これだけ粘着的にこだわって、実は IDE で RAID も組んでません、とかいうオチはないよな?
0374nobodyさん03/04/22 20:41ID:???
妥協しないぐらい食材にこだわって、実は化学調味料ドバドバ入れちゃうみたいな?
0375っていうか03/04/24 13:03ID:???
別ファイルに書き込んで mv
これ定説
0376山崎渉03/05/22 02:08ID:???
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
0377nobodyさん03/05/22 07:17ID:???
厨房な質問で悪いんですが、mkdirを使ったファイルロックってこういうことですか?

if (opendir(LOCK, "lock")) {
  closedir(LOCK);

  rmdir("lock");

  # 処理

  mkdir("lock");
}
0378nobodyさん03/05/22 09:34ID:sAd9/kNT
mkdir("lock")
じゃなくて
mkdir("lock", 600)
でした。
0379nobodyさん03/05/22 10:08ID:???
>>378
違う。
if (mkdir ("lock", 755)) {
  (処理)
}

こう。
mkdirは、ディレクトリの作成に成功すると真が、
失敗すると偽が返ってくる。
0380nobodyさん03/05/22 13:35ID:2b2Zl4vP
>>379
?それだけでいいんでふか?
0381nobodyさん03/05/22 13:46ID:???
20代OLです毎日上司のセクハラや通勤電車での痴漢でストレスがたまっていた
そのときにネットで見つけたアダルトDVDショップ以前からオナニー用にDVD
が欲しかったのですぐ注文しました、とても安くてびっくりしましたが次の日には
もう届きました私が買ったのは、オナニー、レズ、レイプです毎日オナニーしてま
す。
http://www.net-de-dvd.com/
0382nobodyさん03/05/22 13:53ID:???
>>380
ttp://homepage1.nifty.com/glass/tom_neko/web/web_04.html
このへんでも参考に
0383380 じゃないけど03/05/22 15:06ID:???
>>382
激しく参考になりますた。謝謝。

ところで
flock() が使えないところで

eval{ if(!(flock(FH, 2))){ &function; } };

とした場合ちゃんとサブルチンに逝ってくれますか?
false は返ってくるんでしょうか?
0384nobodyさん03/05/22 15:40ID:Mzhw6+0o
>>382
サンクスコ(・∀・)
0385nobodyさん03/05/23 13:24ID:ORCLTuvq
ロックする時にmkdirでディレクトリを作って、
アンロックする時にrmdirでディレクトリ削除ってことですよね?

>>382のサイト見てないけど…。
0386nobodyさん03/05/23 13:28ID:???
>>385
見ろ。
0387山崎渉03/05/28 17:07ID:???
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
0388nobodyさん03/05/28 18:03ID:???
age
0389nobodyさん03/05/31 21:04ID:n0OtuFEQ
ロックされてるかどうか調べるにはどうしたらいい?
他のプロセスでロックしてるファイルにアクセスしてもロックがすぐ終っちゃうような…。

どうすれバインダー。
0390動画直リン03/05/31 21:10ID:1EAhrEiJ
http://homepage.mac.com/hitomi18/
0391nobodyさん03/05/31 21:44ID:???
>>389
激しくロックの方法に依ると思うんだが。
039238903/05/31 21:45ID:n0OtuFEQ
全般的にできるのはないの?
0393nobodyさん03/05/31 22:08ID:nC5SP5sD
>>392
ロック中に
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
>>393
おぉ!蟻がとう。
0396nobodyさん03/06/01 12:29ID:???
>>393
禿げ藁
0397nobodyさん03/06/01 13:22ID:???
>>394
駄目ロック。これ使うならロックしなくていい。
0398nobodyさん03/06/01 21:54ID:???
アンケートみたいに読み出しが少なくて、書き込みが多いときに
flockと組み合わせて(かつcron回してファイルをまとめつつ)
使ってたんだけど。。。駄目かぁ(´Д`;)
0399nobodyさん03/06/02 00:36ID:???
>>398
> mkdir($filename)unless -d $filename;
意味なし。複数のプロセスでunless -d $filenameが成立する可能性がある。
排他制御するにはアトミックにやらないと駄目。

排他制御に強い/弱いは無い。正しいか駄目のどちらか一方、わずかでも可能性があれば駄目ロック。
0400nobodyさん03/06/02 09:59ID:7y9vki3n
そういえばみんななんで、
--$retry <= 0
なんてやってるの?
$retry--
じゃまずいの?
0401nobodyさん03/06/02 10:09ID:Ixodm31c
みてね♪
http://www1.free-city.net/home/s-rf9/page006.html
0402nobodyさん03/06/02 10:20ID:sw1UrgM5
               ∧_∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
              ( ´∀`)/< 先生もろDVDはどこですか?
           _ / /   /   \___________
          \⊂ノ ̄ ̄ ̄ ̄\
           ||\        \
           ||\|| ̄ ̄ ̄ ̄ ̄||                
           ||  || ̄ ̄ ̄ ̄ ̄||         ∧_∧    / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  
              .||          ||         (´Д` )  <  http://www.dvd01.hamstar.jp だ!
                              /   \   \___________
                              ||  ||  
                              ||  ||
                         __ //_ //___
                        /  //  //      /
                       /    ̄     ̄      //
                       || ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||  ||
                       || ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||  ||
                       ||    教卓         ||  ||
                       ||                ||


0403nobodyさん03/06/02 10:29ID:???
>>400
デクリメントの事言ってるのか?
前置きと、後置きでは、動作が違う。
そして、スレ違い。
0404nobodyさん03/06/02 10:35ID:azLkJHuz
>>403
いやいや、なんで<=を使ってるかが知りたいの?
ifって偽だと実行しないでしょ?
$retryは最終的に0になるわけだから、<=は必要ないだろ。

ってかスレ違いって分かってるので、逝ってきます。
0405nobodyさん03/06/02 10:39ID:7y9vki3n
良く見たら答えが分かった。馬鹿か俺。

やっぱり逝くしかないな…。
0406直リン03/06/02 11:10ID:mGHfwiJV
http://homepage.mac.com/yuuka20/
0407nobodyさん03/06/02 11:20ID:???
>>404-405
0は偽だが、-1は真になる。

上げてる時点で逝ってください( ̄人 ̄)
0408nobodyさん03/06/02 11:42ID:???
>>407
でも絶対-1にはならなくない?

まだ逝ってないよ、俺。
0409nobodyさん03/06/02 12:07ID:???
>>408
いや・・・だからさ・・・
全体のソース読んでないんで分からないんだけど。
マイナスになる可能性があるかもしれないんでしょ?

--$retry <= 0

この条件だと、$retryがもし0だったら・・・
-1 <= 0
こんな判定になるし。
0が入る訳がないソースだったとしても、
ちゃんと条件書いてる方が、見た目分かりやすいってのもある。
そして、スレ違いだから、やっぱ逝くべき。
0410nobodyさん03/06/02 12:14ID:???
>>404
> いやいや、なんで<=を使ってるかが知りたいの?
・・・え? 問い掛けられても・・・
0411nobodyさん03/06/02 12:16ID:???
>>408
> でも絶対-1にはならなくない?
お前プログラマに向いてない。確実に-1になる。わかったら逝け、わからなくても逝け。
0412nobodyさん03/06/02 12:47ID:YkiHze2n
>>411
うおっ!キツイ一言だな…。
でもこのスレのヤシらはなんか優しい…。

すっきりしたら逝くから、すっきりさせろYO!

なんで-1になるんだ?
粘着房だな…。
0413nobodyさん03/06/02 13:02ID:???
>>412
だから・・・・

--$retry <= 0

↑これだけ見せられて、-1になるか、ならないかって言われても、
分からない訳なのよ。
どのソースみて、言ってる訳?

とにかく、その一行を見る限りでは、-1になる可能性はある。
何度も言うようにスレ違いだから、優しいうちに逝っとけ。
0414動画直リン03/06/02 13:10ID:mGHfwiJV
http://homepage.mac.com/hitomi18/
0415nobodyさん03/06/02 13:14ID:???
>>413
そういうことね。
上の方のソースやKENTのソース。

おとなしく逝っときます。
スレ違いのことをしつこくスマンカッタ…。
0416nobodyさん03/06/02 13:43ID:???
Cプログラマ的にはif (--retry)の方が早い気がする。
気がするであって、気にする奴が本当に気にしなきゃいけない場合はアセンブラで書く。
0417_03/06/02 14:38ID:???
http://homepage.mac.com/hiroyuki43/moe/jaz01.html
0418_03/06/02 16:09ID:???
http://homepage.mac.com/hiroyuki43/moe/jaz01.html
0419_03/06/02 19:13ID:???
http://homepage.mac.com/hiroyuki43/hankaku/hankaku07.html
0420nobodyさん03/06/03 08:26ID:???
>>416
おまえも素質ないから早くプログラマから足洗った方がいいぞ。
0421nobodyさん03/06/17 05:57ID:???
http://search.cpan.org/author/MAKOTO/IO-File-flock-0.07/
これって使っても平気ですか?
0422nobodyさん03/06/22 16:13ID:???
房な質問なんですけど、そんな頻繁にデッドロックって起こるものなんでしょうか?
0423nobodyさん03/07/07 19:32ID:???
10 'ファイルの書き込み
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:???
情報処理
0426nobodyさん03/07/08 12:12ID:???
>>424
歯科医師
0427nobodyさん03/07/08 12:19ID:???
国家公務員一級
0428nobodyさん03/07/08 15:54ID:???
シスアドだべ。
0429nobodyさん03/07/08 15:58ID:???
公害防止管理者だろ
0430nobodyさん03/07/09 00:33ID:???
>>426
司会者?
0431nobodyさん03/07/10 16:21ID:QDkm5VXP
初心者で申し訳ない。
flock使えるサーバなんだけど、書き込み中はロックするっていう
対象のファイルをflockの引数にするのと、別のダミーファイルを
flockの引数にするのとあるでしょ。どっちがいいのでつか。


0432nobodyさん03/07/10 17:46ID:???
場合によるっしょ。
処理全体にかけたいなら後者の方が良いかと。
0433nobodyさん03/07/10 21:42ID:???
先生、Webプログラミング界では共有ロックが理解されていません
043443103/07/10 22:35ID:???
>>432
ありがとん。
>>433
漏れのこと言ってるようでつね。勉強してきまつ。
0435nobodyさん03/07/11 11:17ID:???
そりゃステレオタイプだ
0436nobodyさん03/07/14 17:20ID:???
>>424
おまいいい加減教えろ!
0437なぞなぞ先生03/07/15 06:43ID:???
OSやSOFTWAREの基本的なことで申し訳ないのですが、
完全に同時にプロセスが発生することはないよね?
マルチタスクってのもマルチスレッドってのも基本的に擬似的に行っているもので、
結局は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:???
>>437
レスが1000を超えるのはdatファイルへの書き込みと、
レスポンス数のチェック(書き込み禁止処理)がアトミックにできないから。

実際には、二つの処理に結構な間があると思う。
0441nobodyさん03/07/15 22:40ID:???
              ∩
             | |
       ∧_∧  | |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
      ( ´ー`)//  < 先生!
      /     /    | アトミックって何ですか?
     / /|    /     \___________
  __| | .|    | __
  \   ̄ ̄ ̄ ̄ ̄   \
  ||\            \
  ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
  ||  || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
     .||              || 
0442nobodyさん03/07/15 23:25ID:???
表現がおかしい?(慣れない横文字は使うもんじゃないね

他のプロセスが割り込めない極小時間(ワンステップ)で操作。
にしといてくださいな。
0443nobodyさん03/07/16 07:27ID:???
いや、アトミックという言葉は普通に使うと思うぞ
ましてやファイルロックの話題ならなおさら
044443703/07/16 08:09ID:???
その件なのですが、1000のカキコをログに書き込んだら、
ファイルロック中に何らかの処理(たとえば別ファイルにHTML書き出しやHTML化待ちDATリストへの追加)
をすれば、"アトミック"は存在しないと思うのですが。

下手な考えスマソ。。。
044544003/07/16 22:09ID:???
>>444
ああっと、flockが頭にあったので、、
renameが理想的なロックとして動作するとしたら>>437で可能だと思います。
(OSがlinuxの場合は壊れたりするけど…)

2chとしては、1000で止まらなくても(多少レスが多く付いても)構わないのかも。
(ロックする時間が増える→待ちプロセス数が増える→サーバ負荷が増えるよりは。)
044643703/07/17 00:22ID:???
>ロックする時間が増える→待ちプロセス数が増える→サーバ負荷が増える
2chみたいな大規模な掲示板だとここが問題なんですね。
ぐっすり眠れそうな気がしました。レスありがとうございました。
0447nobodyさん03/07/19 14:28ID:???
2ch互換スクリプトの場合、スレ立て処理に問題抱えてる場合があるので注意。
スレッドキー(ファイル名)決定と、ファイル作成(書き込み)を別の場所で
行っている事がほとんどなので、同時にスレ立てが発生するとスレッドが
合体する可能性がある。

半年前あたり2chでもちょっと問題になってた。
実際としては2ch以外で問題になることは無いと思うけどね。
■ このスレッドは過去ログ倉庫に格納されています