[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/10 00:43 / Filesize : 262 KB / Number-of Response : 974
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:nobodyさん [02/06/23 10:18 ID:eY2l+Gw1]
どんな環境でも使えて、軽くて、頑丈なロックを考えようじゃありません

445 名前:440 mailto:sage [03/07/16 22:09 ID:???]
>>444
ああっと、flockが頭にあったので、、
renameが理想的なロックとして動作するとしたら>>437で可能だと思います。
(OSがlinuxの場合は壊れたりするけど…)

2chとしては、1000で止まらなくても(多少レスが多く付いても)構わないのかも。
(ロックする時間が増える→待ちプロセス数が増える→サーバ負荷が増えるよりは。)

446 名前:437 mailto:sage [03/07/17 00:22 ID:???]
>ロックする時間が増える→待ちプロセス数が増える→サーバ負荷が増える
2chみたいな大規模な掲示板だとここが問題なんですね。
ぐっすり眠れそうな気がしました。レスありがとうございました。

447 名前:nobodyさん mailto:sage [03/07/19 14:28 ID:???]
2ch互換スクリプトの場合、スレ立て処理に問題抱えてる場合があるので注意。
スレッドキー(ファイル名)決定と、ファイル作成(書き込み)を別の場所で
行っている事がほとんどなので、同時にスレ立てが発生するとスレッドが
合体する可能性がある。

半年前あたり2chでもちょっと問題になってた。
実際としては2ch以外で問題になることは無いと思うけどね。

448 名前:nobodyさん mailto:sage [03/07/20 07:55 ID:???]
>>447
スレアドレス決定とファイル作成を同じスクリプトで行えばオッケー?

449 名前:nobodyさん mailto:sage [03/07/20 09:18 ID:???]
>>448
そういうことじゃない。
スクリプトの中でキー決定からファイル作成までの間に
いろいろな処理があって、同時スレ立ての一方がファイル作成前に
もう一方がそのキーのスレがあるか確認して存在しないと
判断してしまう時差の問題が起こりえるということ。

450 名前:nobodyさん [03/07/26 13:13 ID:GHzBAdl/]
flock のロックをしたいんですが、
具体的に何をすれば良いのでしょうか?
flock と言う名前のディレクトリを
作って、ロックしたいファイルに
置いとけば良いのでしょうか?
すいませんが、まるっきりの初心者ですので、
教えて下さい。

451 名前:nobodyさん mailto:sage [03/07/26 13:24 ID:???]
>>450
>>1-449

452 名前:nobodyさん mailto:sage [03/07/26 13:55 ID:???]
>>451
ワロタ!
でも、イイ!

453 名前:_ mailto:sage [03/07/26 13:55 ID:???]
homepage.mac.com/hiroyuki44/



454 名前:nobodyさん mailto:sage [03/07/26 18:00 ID:???]
YOU THE☆ROCKは綴りが違いますが、このスレの親戚ですか?

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

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

と言う独り言でした。また来週。

455 名前:nobodyさん mailto:sage [03/07/26 22:03 ID:???]
やっぱりファイルで何らかのロック処理をした後、
flockも使うのが最強ですかね?

456 名前:nobodyさん mailto:sage [03/07/26 22:40 ID:???]
じっさまなら誰もおこらねぇけど、

457 名前:nobodyさん mailto:sage [03/07/27 01:31 ID:???]
>>455
ハァ、Webプログラマーってどうして馬鹿ばっか集まるんだ。
排他制御に強い/弱いはない。正しい/駄目のどちらかだ。
駄目なものをいくつ重ねても駄目なものは駄目。正しい方法を複数使う必要はない。

458 名前:nobodyさん mailto:sage [03/07/27 03:14 ID:???]
結論が出てしまったな・・・

459 名前:nobodyさん mailto:sage [03/07/27 09:30 ID:???]
ドコ━━━(゚Д゚≡(゚Д゚≡゚Д゚)≡゚Д゚)━━━━!!!!???

460 名前:nobodyさん mailto:sage [03/07/27 20:51 ID:???]
Iriaにセキュリティーホールらしいぞ。
tv3.2ch.net/test/read.cgi/geino/1050253651/377


461 名前:nobodyさん mailto:sage [03/08/04 22:07 ID:???]
今の今までflockできないとおもってたが、パーミッション777で解決しちった。

462 名前:nobodyさん [03/08/06 01:55 ID:pOGj2Sy2]
てす

463 名前:nobodyさん [03/08/06 01:56 ID:pOGj2Sy2]
てすてす



464 名前:nobodyさん [03/08/06 01:56 ID:pOGj2Sy2]


465 名前:nobodyさん [03/08/07 14:03 ID:fxtSTKIN]
ちょっと思った。
use Fcntl;
をしといて、
sysopen
を使ってLOCK_EXとか呼べないかな。

466 名前:nobodyさん mailto:sage [03/08/07 14:18 ID:???]
意味不明。
LOCK_EXは定数(を返すだけのsub)

467 名前:nobodyさん mailto:sage [03/08/07 15:00 ID:???]
use Fcntl;
sysopen FILE,"hoge",O_RDWR|O_CREAT|LOCK_EX;
みたいなことできるかってこと?
試してみてね。
俺は知らん。

468 名前:nobodyさん mailto:sage [03/08/08 01:36 ID:???]
>>465
use Fcntl;するならO_SHLOCKとO_EXLOCKが使えるでしょ。
Win系はシラネ。

469 名前:nobodyさん mailto:sage [03/08/08 04:05 ID:???]
>>465
うん、使える。
O_EXLOCKを使ってsysopenで書いてあげたら
もっとスマートなlockができそう。

470 名前:nobodyさん mailto:sage [03/08/09 22:15 ID:???]
>>465
use IO::File::fock;
my $fh = new IO::File::fock('file','>>');


471 名前:山崎 渉 mailto:(^^) [03/08/15 22:42 ID:???]
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン

472 名前:nobodyさん mailto:sage [03/08/24 11:20 ID:???]
flock使えます。
追記の場合って、どうするのが一番確実で負荷がかかんないんでしょうか?
僕は、データを編集する場合と同じように、以下のようにしちゃってますが。use Fcntl qw(:flock);
#万が一リネーム失敗したときのために、ユニークなファイル名にしておく
$tmpfile = "$datafile".".$$.". time() .".csv";
#ロックファイルを作成する(★注:ロックファイルは、各CSVごとにユニークに)
open (LOCKF, ">$datafile"."_lockf") or die("cannot open:$!");
    flock (LOCKF, LOCK_EX);    #ロックファイルをflockする
    open(IN, "< $datafile") or die("cannot open:$!"); # 読みのみモードで開く
        open(TMP,"> $tmpfile"); #テンポラリファイルを作成
            while ($line = <IN>){
                $line .= <IN> while ($line =~ tr/"// % 2 and !eof(IN));
                $line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
                @values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_}
                 ($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
                #必要なものだけをEUCにして、出力時にSJISにする
                foreach $value (@values){
                    &jcode::convert(\$value, "euc");
                };
                #CSV形式に変換
                $newline = join ',', map {(s/"/""/g or /[\r\n,]/) ? qq("$_") : $_} @values;
                print TMP "$newline\n" ;#テンポラリファイルに1レコード書き込み
            }
            print TMP "新しい行" . "\n";
        close TMP;
    close IN;
    unlink $datafile;
    rename ($tmpfile, $datafile) or die ("cannot rename : $!");
close LOCKF;


473 名前:472 [03/08/24 11:25 ID:xfHM1yWk]
あ、よく考えたら、既存の行をいちいち@valuesにする必要はないんだ・・・
訂正。
↓これでどうでしょか?

use Fcntl qw(:flock);
#万が一リネーム失敗したときのために、ユニークなファイル名にしておく
$tmpfile = "$datafile".".$$.". time() .".csv";
#ロックファイルを作成する(★注:ロックファイルは、各CSVごとにユニークに)
open (LOCKF, ">$datafile"."_lockf") or die("cannot open:$!");
    flock (LOCKF, LOCK_EX);    #ロックファイルをflockする
    open(IN, "< $datafile") or die("cannot open:$!"); # 読みのみモードで開く
        open(TMP,"> $tmpfile"); #テンポラリファイルを作成
            while ($line = <IN>){
                print TMP $line ;
            }
            print TMP "新しい行" . "\n";
        close TMP;
    close IN;
    unlink $datafile;
    rename ($tmpfile, $datafile) or die ("cannot rename : $!");
close LOCKF;





474 名前:472 [03/08/24 11:57 ID:xfHM1yWk]
あるいはもう1つの選択枝。
単純に、

use Fcntl qw(:flock);
open(OUT, "+< $datafile");
    flock (LOCKF, LOCK_EX);
        truncate(OUT, 0);          # ファイルサイズを0バイトにする
        seek(OUT, 0, 0);            # ファイルポインタを先頭にセット
        print OUT "新しい行" . "\n";;  # 書き込む
close(OUT);                     # closeすれば自動でロック解除

・・・・どっちがいいのでしょうか・・・?

475 名前:nobodyさん mailto:sage [03/08/24 12:53 ID:???]
>>474
追記なら

use Fcntl qw(:flock);
open(OUT, ">>$datafile");
    flock (OUT, LOCK_EX);
        seek(OUT, 0, 2);           # ファイルポインタを最後尾にセット(念のため)
        print OUT "新しい行" . "\n";;  # 書き込む
close(OUT);                     # closeすれば自動でロック解除

--
# 私はこんな感じ(Win不可)
use FileHnadle;
my $fh = new FileHandle($datafile, O_WRONLY|O_CREAT|O_APPEND|O_EXLOCK) or die;
print $fh '新しい行', "\n";
close($fh);

IO::Fileでもいいんだけど、趣味でFileHandle使ってます。

476 名前:nobodyさん mailto:sage [03/08/27 11:26 ID:???]
某K氏のアクセス解析でFlock使うようにしようとしたのですが

open(LOG, ">$logfile") or &error("Open Error : $logfile");
flock(LOG, 2);
seek(LOG, 0, 2);
my(@lines) = <LOG>;

(if($agent =~ /MSIE 3/i) { $agent = 'MSIE 3'; }のような置換とか)

while($max-1 < @lines) { pop(@lines); }
unshift(@lines, "$agent<>$os<>$host<>$referer<>$hour<>$doc_uri<>\n");
unshift(@lines, "$addr\n");

print LOG @lines;
close(LOG);

こうすると書き込み時にログが一旦全部消えてしまい、
取得した最後のログ一行(先頭行に最終アクセスIPがあるので正確には二行)のみになってしまいます。
何処が悪いのでしょうか…

因みに元スクリプトではログを配列に読み込んだ時点で一旦閉じ、
処理後もう一度開いて書き込みという風になってたのですが、
これだと処理中に書き込まれたら駄目そうな気がしたので上のように書き換えたのです。


477 名前:nobodyさん mailto:sage [03/08/27 19:09 ID:???]
>>476
lockどうこうより、while がおかしいのでは?
$max-1 < @lines がどういう比較かわからんけど、自分で
pop(@lines);して削除しちゃってるじゃないの
常にwhileが真で全行削除になってその後unshiftで2行追加してるだけでは?

478 名前:nobodyさん mailto:sage [03/08/27 21:08 ID:???]
>open(LOG, ">$logfile") or &error("Open Error : $logfile");
'>'でオープンすると?
・ファイルの中身を切り詰める。
・書き込み専用でオープンする(ファイルが無ければ作成)。

>seek(LOG, 0, 2);
この意味は?
・フィル最後尾にファイルハンドルを移動する。

さすがに読めません。

479 名前:nobodyさん mailto:sage [03/08/27 21:09 ID:???]
open(LOG, "+<$logfile") or &error("Open Error : $logfile");
flock(LOG, 2);
my (@lines) = <LOG>;

(ロックスレなので、、略)

seek(LOG, 0, 0);
truncate(LOG, 0);
print LOG @lines;
close(LOG);

上の書き方では、seekとtruncateの間で終了させられると、
ファイルの中身が失う危険性があるから、

seek(LOG, 0, 0);
print LOG @lines;
truncate(LOG, ftell(LOG));
close(LOG);

と書くといいらしいです。(実際はどうなんでしょ?)

www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq5.html#How_come_when_I_open_the_file_re
www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq5.html#I_still_don_t_get_locking_I_jus
クックブック 7.11
ttp://homepage1.nifty.com/glass/tom_neko/web/web_04.html

480 名前:479 mailto:sage [03/08/27 22:53 ID:???]
>truncate(LOG, ftell(LOG));
間違いでした。以下の通り。
truncate(LOG, tell(LOG));

481 名前:nobodyさん mailto:sage [03/08/28 11:06 ID:???]
ログだったら、追記で開いて、flockしてファイルの尻seekするだけじゃ
だめなの?

482 名前:nobodyさん [03/08/31 01:47 ID:3rubdTEF]
あるサイトでみたんだけど、
use DB_File;
use Fcntl;
open DAT,"lockfile";
flock(DAT,LOCK_EX);
tie(%hash,'DB_File',"dbfile",O_RDWR|O_CREAT,0666
---DBM代入処理
としてロックしてました。
lockfileというファイルへの排他ロックを取得しているのは
わかるんだけど、それがどうしてDBMのdbfileへのロックと
なるのかわからん。

483 名前:nobodyさん mailto:sage [03/08/31 04:22 ID:???]
>>482
「dbfileを使うプロセスは、かならずdbfileにアクセスする前にlockfileをロックする」
という紳士協定があればうまく行く。

dbfileにアクセスするのが>>482のスクリプトだけの場合も然り。

それでもなぜか分からないなら良く考えてみ。



484 名前:nobodyさん mailto:sage [03/08/31 20:24 ID:???]
>>482
ブロッキングを理解すると分かると思います。

flockでロックされると、LOCK_NBを指定していない限り、
排他される側はflock関数の場所で処理を止められます。

485 名前:482 [03/08/31 22:31 ID:3rubdTEF]
tieする前に必ずファイルロック処理する。
flockをLOCK_SHでした場合は%hashへの代入はしない。
上を全てのdbfileを使う処理でする。
この順番を守ればflockの段階でブロックしてtieへ進まない。
やっと、すっきりした。
>>483.484さんありがとー

486 名前:nobodyさん mailto:sage [03/08/31 23:56 ID:???]
ついでですが、ファイルを排他ロック(LOCK_EX)するときは、
書き込みできる状態でファイルをオープンしないとロックしない
OSがあるそうです。ご注意あれ。

参考:
同じ(ような)処理をするモジュール。
search.cpan.org/author/DHARRIS/DB_File-Lock-0.05/Lock.pm

487 名前:482 mailto:sage [03/09/01 01:40 ID:???]
>>486
open LOCK,'<lockfile';
ってするてことですね。気をつけます。
このモジュール結構便利ですね。
ありがとございます。
perlの面白みにはまっっていく・・土日外にでてねえ・・

488 名前:nobodyさん mailto:sage [03/09/01 19:13 ID:???]
LOCK_SHしといて、STORE〜SYNCまでの間LOCK_EXにして
SYNCがかかったらSHにもどしちゃダメ?
LOCK_EXの時間は短い方がいいとおもうんだけど

489 名前:nobodyさん mailto:sage [03/09/01 22:19 ID:???]
>>488
魅力的ですが、共有ロック(LOCK_SH)をしているところに
排他ロック(LOCK_EX)をしようとすると、
ブロックされて待たされることになります。

書き込む事がほとんどないのであれば、
検討する価値はあるかも。

ロックしたら、操作、すぐ開放が基本です。

490 名前:488 mailto:sage [03/09/02 11:52 ID:???]
> 魅力的ですが、共有ロック(LOCK_SH)をしているところに
> 排他ロック(LOCK_EX)をしようとすると、
> ブロックされて待たされることになります。
同じプロセスならLOCK_SHからLOCK_EXへ移行できちゃったんですが...


491 名前:nobodyさん mailto:sage [03/09/02 20:13 ID:???]
言いたかったのは、こんなイメージです。

 processA     processB
   |         |
flock(F, LOCK_SH);   |
   |         |
  処理    flock(F, LOCK_EX);
   |          :
   |          :  (ブロックされる)
   |          :
 close(F);       処理 (ここで処理開始)
   |         |
   exit;        |
            close(F);
              |
             exit;

492 名前:490 mailto:sage [03/09/04 22:14 ID:???]
そっか、タイミングがちょっと遅くなるだけで、結局待たされるんだ。。。
って事でwww.perldoc.jp/docs/modules/DB_File-1.805/DB_File.poをみると・・・
まともにロックしたかったらBerkeleyDBを使えっと(´Д`;)



493 名前:nobodyさん [03/09/06 01:39 ID:A9Khhwgn]
flockでここまでスレが伸びるのか・・・。
漏れなら小規模の場合は消えるの覚悟で単純にflockだけ(面倒)。
中規模以上はDB立ててDBのLOCKで対処。

これじゃいかんのか?



494 名前:nobodyさん mailto:sage [03/09/06 02:09 ID:???]
俺もDBマンセー

495 名前:nobodyさん mailto:sage [03/09/06 03:10 ID:???]
>>493
flockで消えちゃうのは、何かお前のやり方に問題があるんだと思うぞ。
システム自体がflockの堅牢性に頼っていると言うのに。

496 名前:nobodyさん mailto:sage [03/09/07 02:25 ID:???]
flockにも限界があるので、できるなら餅は餅屋に任せるのがいいと思いますよ。

497 名前:nobodyさん mailto:sage [03/09/07 10:06 ID:???]
>>496
限界って?
Windowsやover networkでうまく働かない以外に何か問題あったっけ?

だいたいflock使えねーとか言ってるヤツのコードみると書き方間違ってる
だけだったりするんだよな。

ごちゃごちゃ言う前にモジュール使えってのはまぁ同意だけど。

498 名前:nobodyさん [03/09/07 14:44 ID:AN0xO5Ef]
>Windowsやover networkでうまく働かない以外に何か問題あったっけ?

ありますよ。ご自分でお調べください。

499 名前:nobodyさん mailto:sage [03/09/07 15:01 ID:???]
>>498
あとは昔のOSでバッファをフラッシュしないくらいしか思いつかないなあ。

UN*X系のOSで別に正しく使えばファイルが消えちゃうとかはないでしょ?

500 名前:nobodyさん mailto:sage [03/09/07 15:03 ID:???]
UNIX系でflockに対応してないものもある、見たいなのを読んだ事があるけど本当ですかね?

501 名前:nobodyさん mailto:sage [03/09/07 15:04 ID:???]
>>499
>>496=498は適当に言ってるだけですよ。

502 名前:nobodyさん mailto:sage [03/09/07 15:14 ID:???]
そんな感じだな

503 名前:496 mailto:sage [03/09/07 19:04 ID:???]
>>497
flockでデータベースを丸ごとロックするより、
他の方法を使ったほうが限界性能が上がると言いたかったのですが…。

別の話として。
>Windowsやover networkでうまく働かない以外に何か問題あったっけ?
ActivePerlの場合、WIN32APIのLockFileEXが使えれば、Windowsでも使えます。
そして、それはうまく働きます。

私はflock(2)の信頼性を否定しません。
とはいえ、perlのflockについてはperldocに例外事項が書かれています。
(498さんの言いたかったのはこれかな)

perlのflock関数 = flock(2)であるとは限りません。

参考:
perldoc -f flcok
perlソース pp_sync.c
ActivePerlソース win32.c



504 名前:nobodyさん mailto:sage [03/09/07 22:04 ID:???]
>>503
おいおい、何はぐらかしてんだ?
>Windowsやover networkでうまく働かない以外に何か問題あったっけ?

>他の方法を使ったほうが限界性能が上がると言いたかったのですが…。
他の方法とは?

505 名前:nobodyさん [03/09/07 22:26 ID:K46D6zau]
flockからunlockまでの途中で強引に処理を止めて、同じcgiを複数
起動させればflockの信頼性が判るよ。いくつかはロックかからずに
スルーされるからさ。

後はロックの残骸による次プロセス(同一ロック)の停止かな。
遠回りしないと解決出来ないのは面倒。

漏れが間違っているかもしれんが、同時に数千〜数万単位でロックを
必要とする環境に置いて上記の理由からflockは使いたくないです。
よってほとんどDBのロックに任せっきり。DBだと単純なa=a+1の場合だと
DB自体が保証してるんでロック不必要だし。

間違っていたら本当にスマソ。業務でロックを故意に壊しにいった結果
こうなったので。

506 名前:nobodyさん mailto:sage [03/09/07 22:35 ID:???]
>>505
ソースとdfの結果みせてみな。

そういうケースの殆どはファイルシステムがNFSだった、って
オチな訳だが。

もし本当にflock(2)に信頼性がないなら、sendmailがmailboxファイルを消しまくる
現象が世界中で起きてるはずだが。

> 後はロックの残骸による次プロセス(同一ロック)の停止かな。

・・・は?

> 間違っていたら本当にスマソ。

多分間違ってると思う。

507 名前:nobodyさん mailto:sage [03/09/07 23:19 ID:???]
>>505
>いくつかはロックかからずにスルーされるからさ。
どうやって判断してんだ。テストコードがバグってんだろ。よくあることだ。

>ロックの残骸
って何?

>flockは使いたくないです。
>よってほとんどDBのロックに任せっきり
・・・

508 名前:nobodyさん mailto:sage [03/09/07 23:54 ID:???]
最近は、凧や独楽を買ったものの、子供がうまく使いこなせずに「不良品じゃないのか!」と
店に怒鳴り込む馬鹿親がいると聞きますが・・・。

この業界にも、道具を使いこなす努力をせずに、自分の無能を全部道具のせいにする
DQNが増えてきたってことですかね。

509 名前:nobodyさん mailto:sage [03/09/08 10:14 ID:???]
>508
ハゲドウ

しかし、不良だらけの道具を平気で売ってる大企業とかも在るのが実情ではある。
M$とか。

510 名前:496 mailto:sage [03/09/08 13:21 ID:???]
>おいおい、何はぐらかしてんだ?
>>Windowsやover networkでうまく働かない以外に何か問題あったっけ?

perldoc -f flockから引用
>Calls flock(2), or an emulation of it, on FILEHANDLE. Returns
>true for success, false on failure. Produces a fatal error if
>used on a machine that doesn't implement flock(2), fcntl(2)
>locking, or lockf(3).

>On systems that support a real flock(), locks are inherited
>across fork() calls, whereas those that must resort to the more
>capricious fcntl() function lose the locks, making it harder to
>write servers.

というように、いい加減なfnctl(2)によりエミュレーションされた場合は
サーバーの書き込みが激しい場合ロックが失われると書いてあります。

>>他の方法を使ったほうが限界性能が上がると言いたかったのですが…。
>他の方法とは?

データベース側に専用のロック機構があれば、そちらにお任せしますが?
全部flockしますか?

511 名前:nobodyさん mailto:sage [03/09/08 23:47 ID:???]
>>510=>>496
こいつ何言ってんだ?勝手にデータベース使うな。

512 名前:nobodyさん mailto:sage [03/09/09 02:09 ID:???]
>>510
んじゃ、perlにflock(2)の呼び出しが実装されてれば問題がないということでよろしい
でしょうか?

俺は思わず「fcntlがダメダメ -> POSIX準拠と呼べない -> UNIX系とも呼べない」
と思ってしまったが。

513 名前:496 mailto:sage [03/09/09 20:09 ID:???]
>>512
flock(2)が機能して、正しく使えていれば問題ないかと。
私の知る限りでは、fcntl(2)でも十分信頼性はあると思いますけどね。



514 名前:nobodyさん [03/09/12 14:11 ID:e1VX9Ox6]
flock(2)とPerlのflockを混同するから話がややこしくなるんだよな。

flock(2)はover networkじゃなく、正しく使えば基本的に堅牢。
Perlのflockはコンパイルされた環境依存、ってとこか。
fcntlでもちゃんとPOSIXに準拠してれば問題ないはず。

その腐ったfcntlを実装してるOSが何なのか知りたい。
Larryの事だから、誰も使わないようなかなりマイナーな物を
想定しているような気がするが。

しかしfcntlは堅牢でないからDBを使う、といってる人がいたが、
じゃぁそのDBはどうやってファイルをロックしてるんだろう?

515 名前:nobodyさん mailto:sage [03/09/12 19:43 ID:???]
システムのロック以上の能力を持つロックは不可能です。

と言い切ってみるテスト…。

516 名前:nobodyさん mailto:sage [03/09/13 00:45 ID:???]
fcntl がクソな実装を具体的に挙げられない限り、flock 否定派の香具師は議論にならん。

517 名前:nobodyさん mailto:sage [03/09/13 23:39 ID:???]
>>516
UNIX系ならまず大丈夫、ということで良いだろ。
fcntl失敗する時点でUNIX失格だからな。

518 名前:nobodyさん mailto:sage [03/09/14 21:13 ID:???]
>>514
PostgreSQLだったらセマフォ。

>>517
qmail.jp/mta/spool.htmlでも触れられているが、
NFSでlockdが腐る現象がまれに発生する事を実際に経験している。
(俺は信者じゃない)

519 名前:518 mailto:sage [03/09/14 21:24 ID:???]
> PostgreSQLだったらセマフォ。
これ、やっぱ嘘かも。
しかし、排他制御のプリミティブはfcntlやflockだけではない。

520 名前:nobodyさん mailto:sage [03/09/15 06:39 ID:???]
突然だけどflockってなんて読んでる?

521 名前:nobodyさん mailto:sage [03/09/15 06:42 ID:???]
えふろっく

522 名前:nobodyさん mailto:sage [03/09/15 07:54 ID:???]
ファイナルロック>510


523 名前:nobodyさん mailto:sage [03/09/15 10:38 ID:???]
限界でもファイルロックだろうね。



524 名前:nobodyさん mailto:sage [03/09/15 17:19 ID:???]
search.cpan.orgで、flockとかfile lockをキーで引いてみると
結構でてくるのですが、どれかお勧めはありますか?
それとも毎回自分で処理を書いたほうがいいのでしょうか?


525 名前:nobodyさん mailto:sage [03/09/15 18:11 ID:???]
このスレでそんな質問しても無駄。
「flock は腐ってる。 DB 使え」という答えしか返ってこない。

526 名前:nobodyさん mailto:sage [03/09/15 23:20 ID:???]
>>524
それぞれ用途が違うから、必要に応じて使えばいい。

527 名前:nobodyさん mailto:sage [03/09/15 23:44 ID:???]
>>525
そんなこと書いてるのは約一名だろ。

>>524
perl -MConfig -e 'print $Config{d_flock}."\n"'

これ実行して「define」と出ればflock(2)が実装されてるからまず大丈夫。
ネットワーク越しでなければラクダ本に書いてあるflockのサンプルで充分。

528 名前:nobodyさん mailto:sage [03/09/16 00:04 ID:???]
ラクダ本の見て必要無いのにseek(FH, 0, 2)とかやってる奴
何人か見た事あるので充分なのかどうかは微妙とか言ってみるテスツ。


529 名前:nobodyさん mailto:sage [03/09/16 01:04 ID:???]
最近はseek(FH, 0, 2)いらんよね

530 名前:nobodyさん mailto:sage [03/09/16 02:04 ID:???]
>>528
別にseekやってもオーバーヘッド以外の害はないんだし、害がある場合もレアケースながら
存在するので、的確かどうかはともかく、少なくとも「充分」ではあるのでは?

531 名前:nobodyさん mailto:sage [03/09/27 12:58 ID:???]
こんなロック処理はどうだ?

mkdirで新規ディレクトリを作ったうえで、ロック成立条件を満たした場合にロック完了とする。
ディレクトリ名にタイムアウト時刻と共有/排他ロックの種別を埋め込む。

共有ロック時はディレクトリ作成後に、親ディレクトリのファイルリストを取得して、
自分の作ったディレクトリよりも前に排他ロックディレクトリが作成されていなければ、ロック完了。
排他ロック時も同様に、自分の作ったディレクトリよりも前にディレクトリが作成されていなければ、ロック完了。
もちろん、ファイルリスト取得時にタイムアウト時刻を過ぎたディレクトリは消去する。

環境依存せずに、read-write lock patternをperlで実装するとこうなるね。

532 名前:nobodyさん mailto:sage [03/09/29 13:16 ID:???]
環境依存せずに。。。という話なんだけど、
flockサポートしてない環境ってそんなに一杯あるんですか?
windows 9xでサーバ立てる香具師はほっといたとして、、、
nkfのlock機構って精度低いんですか?


533 名前:nobodyさん mailto:sage [03/09/30 04:58 ID:???]
>>532
nkf の lock 機構ってのは聞いたことないんだが、

・・・っていうか、一体いつまでおんなじような議論を堂々巡りで続ける気なんですか?!?!



534 名前:nobodyさん mailto:sage [03/09/30 05:00 ID:???]
あ、ところで、 >>531 の方法は、
なかなか良さげっていうか、問題無さそうな気がするんですがどうなんでしょうね?

535 名前:532 mailto:sage [03/09/30 11:52 ID:???]
nfsの間違えでした(スマソ

536 名前:nobodyさん mailto:sage [03/09/30 12:29 ID:???]
>>534
ほぼ同じ仕様のコードが既に公開されてて、有難く使わせて頂いてます。

537 名前:531 mailto:sage [03/09/30 17:11 ID:???]
>>536
どこで公開されてたか教えれ!

538 名前:nobodyさん mailto:sage [03/10/02 03:29 ID:???]
>>536
もしかして、ここかしら?
ttp://www.mindcompass.sfcgi.com/200303.html

539 名前:531 mailto:sage [03/10/02 09:02 ID:???]
>>538
やっぱうちのサイトですか(w

で、今改良版を作ってるのですが、タイムアウト時刻をディレクトリ名にすると、同時にタイムアウト時刻が
違うロックを作ると誤動作するな。

だから、現在時刻をディレクトリ名にして、ディレクトリの作成時刻をタイムアウト時刻に変更すると言う
アクロバティックな操作が必要かもね。

改良版出来上がったら公開しますか?(y/n)



540 名前:nobodyさん mailto:sage [03/10/02 16:33 ID:???]
>>539

自作CGIを評価するスレ
pc2.2ch.net/test/read.cgi/php/1049514428/470

何これ。恥ずかしがりやさんなのかな。


541 名前:nobodyさん mailto:sage [03/10/02 22:14 ID:???]
>>540
さんくす。こんなスレがあるとは知りませんですた。
さっそくそっちのほうにageてみました。

542 名前:nobodyさん mailto:sage [03/10/03 18:38 ID:???]
>>541
いやいや何か勘違いしてない?
ファイルロックの話なんだからこのスレでいいだろう。

俺の言いたかったのは>>539の最後に(y/n)があって、
何故かpc2.2ch.net/test/read.cgi/php/1049514428/470
yと答えてたので報告したまでです。


543 名前:nobodyさん mailto:sage [03/10/03 18:51 ID:???]
>>531
これって安全そうでよさげな気はするんだけど、
ちょっと思ったんだけど、ものすごくアクセス多い場合に、
ディレクトリ作成〜ファイルリスト検査のタイムラグのせいで、
いつまでたってもだれもロックを取得できない、ってな状況になりそうな気がする。



544 名前:531 mailto:sage [03/10/05 10:57 ID:???]
新バージョンageてみました。
今度の奴は、ロックする側のプロセスがタイムアウト時間を個別に設定できます。

do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/index.html

>>543
確かにファイルリスト検査に時間がかかるが、ならばどうしろと?


545 名前:nobodyさん mailto:sage [03/10/06 12:54 ID:???]
>>544
いや、どうすればいいか私にも思い付きません。すいません。
単にデメリットを挙げてみただけで、
だからといってその方法が使えねーとかいう気も毛頭ありません。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<262KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef