[表示 : 全て 最新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]
どんな環境でも使えて、軽くて、頑丈なロックを考えようじゃありません

411 名前:nobodyさん mailto:sage [03/06/02 12:16 ID:???]
>>408
> でも絶対-1にはならなくない?
お前プログラマに向いてない。確実に-1になる。わかったら逝け、わからなくても逝け。

412 名前:nobodyさん [03/06/02 12:47 ID:YkiHze2n]
>>411
うおっ!キツイ一言だな…。
でもこのスレのヤシらはなんか優しい…。

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

なんで-1になるんだ?
粘着房だな…。

413 名前:nobodyさん mailto:sage [03/06/02 13:02 ID:???]
>>412
だから・・・・

--$retry <= 0

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

とにかく、その一行を見る限りでは、-1になる可能性はある。
何度も言うようにスレ違いだから、優しいうちに逝っとけ。


414 名前:動画直リン [03/06/02 13:10 ID:mGHfwiJV]
homepage.mac.com/hitomi18/

415 名前:nobodyさん mailto:sage [03/06/02 13:14 ID:???]
>>413
そういうことね。
上の方のソースやKENTのソース。

おとなしく逝っときます。
スレ違いのことをしつこくスマンカッタ…。

416 名前:nobodyさん mailto:sage [03/06/02 13:43 ID:???]
Cプログラマ的にはif (--retry)の方が早い気がする。
気がするであって、気にする奴が本当に気にしなきゃいけない場合はアセンブラで書く。

417 名前:_ mailto:sage [03/06/02 14:38 ID:???]
homepage.mac.com/hiroyuki43/moe/jaz01.html

418 名前:_ mailto:sage [03/06/02 16:09 ID:???]
homepage.mac.com/hiroyuki43/moe/jaz01.html

419 名前:_ mailto:sage [03/06/02 19:13 ID:???]
homepage.mac.com/hiroyuki43/hankaku/hankaku07.html



420 名前:nobodyさん mailto:sage [03/06/03 08:26 ID:???]
>>416
おまえも素質ないから早くプログラマから足洗った方がいいぞ。

421 名前:nobodyさん mailto:sage [03/06/17 05:57 ID:???]
search.cpan.org/author/MAKOTO/IO-File-flock-0.07/
これって使っても平気ですか?


422 名前:nobodyさん mailto:sage [03/06/22 16:13 ID:???]
房な質問なんですけど、そんな頻繁にデッドロックって起こるものなんでしょうか?

423 名前:nobodyさん mailto:sage [03/07/07 19:32 ID:???]
10 'ファイルの書き込み
20 Open "Text1.txt" For Output As #1
30 Print #1,"Write file."
40 Close #1

ファイルロックのためのtmpファイル作成しようと思ったんですが、
プログラム内で擬似マルチタスクを作成している時といないときがあるので、
flock関数みたいなものがあれば効率が上がると思うのですが、
やはりrename形の方が安全で軽いのでしょうか?

424 名前:なぞなぞ先生 mailto:sage [03/07/08 06:24 ID:???]
排他処理するために必要な国家資格はなぁんだ?

425 名前:nobodyさん mailto:sage [03/07/08 12:02 ID:???]
情報処理

426 名前:nobodyさん mailto:sage [03/07/08 12:12 ID:???]
>>424
歯科医師

427 名前:nobodyさん mailto:sage [03/07/08 12:19 ID:???]
国家公務員一級


428 名前:nobodyさん mailto:sage [03/07/08 15:54 ID:???]
シスアドだべ。

429 名前:nobodyさん mailto:sage [03/07/08 15:58 ID:???]
公害防止管理者だろ



430 名前:nobodyさん mailto:sage [03/07/09 00:33 ID:???]
>>426
司会者?

431 名前:nobodyさん [03/07/10 16:21 ID:QDkm5VXP]
初心者で申し訳ない。
flock使えるサーバなんだけど、書き込み中はロックするっていう
対象のファイルをflockの引数にするのと、別のダミーファイルを
flockの引数にするのとあるでしょ。どっちがいいのでつか。




432 名前:nobodyさん mailto:sage [03/07/10 17:46 ID:???]
場合によるっしょ。
処理全体にかけたいなら後者の方が良いかと。

433 名前:nobodyさん mailto:sage [03/07/10 21:42 ID:???]
先生、Webプログラミング界では共有ロックが理解されていません

434 名前:431 mailto:sage [03/07/10 22:35 ID:???]
>>432
ありがとん。
>>433
漏れのこと言ってるようでつね。勉強してきまつ。


435 名前:nobodyさん mailto:sage [03/07/11 11:17 ID:???]
そりゃステレオタイプだ

436 名前:nobodyさん mailto:sage [03/07/14 17:20 ID:???]
>>424
おまいいい加減教えろ!

437 名前:なぞなぞ先生 mailto:sage [03/07/15 06:43 ID:???]
OSやSOFTWAREの基本的なことで申し訳ないのですが、
完全に同時にプロセスが発生することはないよね?
マルチタスクってのもマルチスレッドってのも基本的に擬似的に行っているもので、
結局は1つのプロセスが司っている処理って聞いたことがあったような。
そうすると、OSがダウンしない限りrename型の排他処理
rename
open
処理
close
rename
は完璧に有効だと思うんだが。
と思ったけど、それを言い始めたらキリが無いかw

うーん、、、しかしたまに2chで1001を超えるのは何でだろう。
ロック解除してから1001のチェックをしているのかな。。。

最近うなされて困ってます。変な文&長文すまん。

438 名前:nobodyさん mailto:sage [03/07/15 06:44 ID:???]
いかぁん、名前が残ってた!!!

氏のう。。。。

439 名前:山崎 渉 mailto:(^^) [03/07/15 11:08 ID:???]

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄



440 名前:nobodyさん mailto:sage [03/07/15 19:03 ID:???]
>>437
レスが1000を超えるのはdatファイルへの書き込みと、
レスポンス数のチェック(書き込み禁止処理)がアトミックにできないから。

実際には、二つの処理に結構な間があると思う。

441 名前:nobodyさん mailto:sage [03/07/15 22:40 ID:???]
              ∩
             | |
       ∧_∧  | |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
      ( ´ー`)//  < 先生!
      /     /    | アトミックって何ですか?
     / /|    /     \___________
  __| | .|    | __
  \   ̄ ̄ ̄ ̄ ̄   \
  ||\            \
  ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
  ||  || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
     .||              || 


442 名前:nobodyさん mailto:sage [03/07/15 23:25 ID:???]
表現がおかしい?(慣れない横文字は使うもんじゃないね

他のプロセスが割り込めない極小時間(ワンステップ)で操作。
にしといてくださいな。


443 名前:nobodyさん mailto:sage [03/07/16 07:27 ID:???]
いや、アトミックという言葉は普通に使うと思うぞ
ましてやファイルロックの話題ならなおさら

444 名前:437 mailto:sage [03/07/16 08:09 ID:???]
その件なのですが、1000のカキコをログに書き込んだら、
ファイルロック中に何らかの処理(たとえば別ファイルにHTML書き出しやHTML化待ちDATリストへの追加)
をすれば、"アトミック"は存在しないと思うのですが。

下手な考えスマソ。。。

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
こいつ何言ってんだ?勝手にデータベース使うな。






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

前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