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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/06/23 10:18ID:eY2l+Gw1
どんな環境でも使えて、軽くて、頑丈なロックを考えようじゃありません
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以外で問題になることは無いと思うけどね。
0448nobodyさん03/07/20 07:55ID:???
>>447
スレアドレス決定とファイル作成を同じスクリプトで行えばオッケー?
0449nobodyさん03/07/20 09:18ID:???
>>448
そういうことじゃない。
スクリプトの中でキー決定からファイル作成までの間に
いろいろな処理があって、同時スレ立ての一方がファイル作成前に
もう一方がそのキーのスレがあるか確認して存在しないと
判断してしまう時差の問題が起こりえるということ。
0450nobodyさん03/07/26 13:13ID:GHzBAdl/
flock のロックをしたいんですが、
具体的に何をすれば良いのでしょうか?
flock と言う名前のディレクトリを
作って、ロックしたいファイルに
置いとけば良いのでしょうか?
すいませんが、まるっきりの初心者ですので、
教えて下さい。
0451nobodyさん03/07/26 13:24ID:???
>>450
>>1-449
0452nobodyさん03/07/26 13:55ID:???
>>451
ワロタ!
でも、イイ!
0453_03/07/26 13:55ID:???
http://homepage.mac.com/hiroyuki44/
0454nobodyさん03/07/26 18:00ID:???
YOU THE☆ROCKは綴りが違いますが、このスレの親戚ですか?

flockするファイルのあるディレクトリのパーミッションは任意たんでよいですか?
自分の中で最高の条件を満たすレンタル鯖がflock使えないとかなりへこむ。。。
結局rename型のlockにしてみたんだが、鯖の負荷とか考えたくないなぁ。

ブロードバンド回線開通したら絶対鯖立てたい。

と言う独り言でした。また来週。
0455nobodyさん03/07/26 22:03ID:???
やっぱりファイルで何らかのロック処理をした後、
flockも使うのが最強ですかね?
0456nobodyさん03/07/26 22:40ID:???
じっさまなら誰もおこらねぇけど、
0457nobodyさん03/07/27 01:31ID:???
>>455
ハァ、Webプログラマーってどうして馬鹿ばっか集まるんだ。
排他制御に強い/弱いはない。正しい/駄目のどちらかだ。
駄目なものをいくつ重ねても駄目なものは駄目。正しい方法を複数使う必要はない。
0458nobodyさん03/07/27 03:14ID:???
結論が出てしまったな・・・
0459nobodyさん03/07/27 09:30ID:???
ドコ━━━(゚Д゚≡(゚Д゚≡゚Д゚)≡゚Д゚)━━━━!!!!???
0460nobodyさん03/07/27 20:51ID:???
Iriaにセキュリティーホールらしいぞ。
http://tv3.2ch.net/test/read.cgi/geino/1050253651/377
0461nobodyさん03/08/04 22:07ID:???
今の今までflockできないとおもってたが、パーミッション777で解決しちった。
0462nobodyさん03/08/06 01:55ID:pOGj2Sy2
てす
0463nobodyさん03/08/06 01:56ID:pOGj2Sy2
てすてす
0464nobodyさん03/08/06 01:56ID:pOGj2Sy2
と
0465nobodyさん03/08/07 14:03ID:fxtSTKIN
ちょっと思った。
use Fcntl;
をしといて、
sysopen
を使ってLOCK_EXとか呼べないかな。
0466nobodyさん03/08/07 14:18ID:???
意味不明。
LOCK_EXは定数(を返すだけのsub)
0467nobodyさん03/08/07 15:00ID:???
use Fcntl;
sysopen FILE,"hoge",O_RDWR|O_CREAT|LOCK_EX;
みたいなことできるかってこと?
試してみてね。
俺は知らん。
0468nobodyさん03/08/08 01:36ID:???
>>465
use Fcntl;するならO_SHLOCKとO_EXLOCKが使えるでしょ。
Win系はシラネ。
■ このスレッドは過去ログ倉庫に格納されています