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

709 名前:nobodyさん mailto:sage [04/05/30 22:14 ID:???]
windowsならmutexを使う手があるよん。名前にファイルパス(\は/に置き換えたやつ)
を使う。速いしいいぞ。


710 名前:709 mailto:sage [04/05/30 22:16 ID:???]
はっ、ここはPerlの板だった。
xs使って作るしか、、、。


711 名前:nobodyさん mailto:sage [04/05/30 22:23 ID:???]
>>709 Win32::Mutex
search.cpan.org/~gsar/libwin32-0.191/

712 名前:nobodyさん mailto:sage [04/05/31 00:08 ID:???]
おお、あるんだ。
他のOSとかもないのかな。
lock::mutexとかいう一本にまとめて使えるようなライブラリがいいなぁ。
mutexもセマフォも使えないけどflockは使えるOSだったら、
内部実装はflockでやるとか。


713 名前:357 mailto:sage [04/05/31 20:57 ID:???]
flock使えない機種でmutexを使ってflock模擬したほうがいいか。


714 名前:713 mailto:sage [04/05/31 22:53 ID:???]
うわ、名前間違えた。

715 名前:nobodyさん mailto:age [04/10/09 22:28:45 ID:???]
ダレモイナィ
タアソウスルナラ イマノウチ

716 名前:nobodyさん mailto:sage [04/10/09 23:12:22 ID:???]
open(LOCK, ">lock.tmp");
flock(LOCK,2);
open (IN, "count.dat");
$count=<IN>;
close(IN);
$count=$count++;
open (OUT, ">count.tmp");
print OUT $count;
close(OUT);
rename("count.tmp","count.dat");
unlink("lock.tmp");
flock(LOCK,8);
close(LOCK);

これでOK?

717 名前:nobodyさん mailto:sage [04/10/10 04:46:13 ID:???]
萌えは初心者だから良くわからないけど、
$count=$count++;

$count++;
でいいと思うけど。



718 名前:nobodyさん mailto:sage [04/10/10 16:53:04 ID:???]
>>716
いいえNG

719 名前:716 mailto:sage [04/10/10 16:59:43 ID:???]
>>718
どこら辺がNG?

720 名前:nobodyさん mailto:sage [04/10/10 17:10:11 ID:???]
無駄なことをやってるだけだろ

open (IN, "count.dat");
flock(IN,2);
$count=<IN>;
$count++;
print IN $count;
close(IN);

これでいいじゃん

721 名前:716 mailto:sage [04/10/10 17:16:22 ID:???]
えっ?それじゃ書き込めないのでは?

722 名前:nobodyさん mailto:sage [04/10/10 17:19:40 ID:???]
すまん

open (IN, "+>count.dat");

723 名前:716 mailto:sage [04/10/10 17:36:23 ID:???]
カウンタだとそれでいいけど、掲示板など複数のファイルを弄る場合にはロック用のファイルが必要になるよね?

724 名前:nobodyさん mailto:sage [04/10/10 17:43:35 ID:???]
>>723
そんなのは一概には言えない。
各ファイルは読み込み・書き込み・両方のいずれなのか、
一度に連続して読み書きするのかなど。

725 名前:nobodyさん [04/10/20 14:16:48 ID:ejI/DpjA]
aaa

726 名前:nobodyさん [04/10/21 19:09:46 ID:wxBAgdgR]
perl,phpの両スクリプトから書き込みがあるファイルがあるんだが、
mkdirとかにしといた方が無難かね?
それぞれでflock()したって排他かからない?

727 名前:nobodyさん mailto:sage [04/10/21 19:24:18 ID:???]
実装言語がどれでも中では flock(2) を呼ぶわけだし flock() で問題ないんじゃない?



728 名前:nobodyさん mailto:sage [04/10/21 23:27:35 ID:???]
>>727
デマ飛ばすな。ボケッ

man perlfunc
flock FILEHANDLE,OPERATION
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). flock is Perl's portable file locking interface,
although it locks only entire files, not records.

729 名前:nobodyさん [04/10/22 01:27:00 ID:W+TTmfbF]
>>727
なるほど、結局perl,phpのflock()が同じシステムコールを使うかどうかって所ですかね?
linux(redhat)なんですが、普通にflock(2)使ってると思って良いのかなぁ。

730 名前:nobodyさん mailto: [04/10/22 17:20:32 ID:???]
通常、perlのflock()もphpのflock()も、下位レベルで使ってるシステムコールはflock(2)なわけだが。

731 名前:nobodyさん mailto:sage [04/10/23 01:59:39 ID:???]
言語, OS, ファイルシステム等の実装に依存
php4.3.9/linux はソース確認したところ flock(2) 使ってないよ。fcntl(2)。

732 名前:nobodyさん mailto:sage [04/10/23 02:53:34 ID:???]
perl5.8/linuxはflock(2)だっけ?fcntl(2)だったっけ?

733 名前:nobodyさん mailto:sage [04/10/23 04:34:45 ID:???]
ごめん、phpでもflock(2)使ってた. -->731は間違い
双方とも flock(2) が使える環境では flock が使われる.

また間違ってるかも知れないので、調べたソースを書いておく。
php-4.3.9 ./ext/standard/flock_compat.c
perl-5.8.5 ./pp_sys.c


734 名前:nobodyさん mailto:sage [04/10/23 13:22:56 ID:???]
おお、すばらしい。
flock(2)使える環境って前提になるが(BSD,SystemV,Linux?)、PerlでもPHPでもflock()でいけるのか。
NFS上のディスクは別として。

735 名前:nobodyさん mailto:sage [04/10/25 18:24:04 ID:???]
なるほどねぇ

736 名前:nobodyさん mailto: [04/10/25 19:07:12 ID:???]
lockアゲ

737 名前:nobodyさん [04/11/06 19:49:00 ID:em3fuQlS]
 



738 名前:nobodyさん mailto:sage [04/11/06 19:58:00 ID:???]
flock最強神話

739 名前:nobodyさん mailto:sage [04/11/07 05:49:26 ID:???]
RDBMSで行ロック最強

740 名前:nobodyさん mailto:sage [04/11/07 23:08:21 ID:???]
結局、KENTのmkdirやsymlink、初心者のよく使うflock、どこかでみたrename、格付けするとどうなの?

741 名前:nobodyさん mailto:sage [04/11/08 00:05:16 ID:???]
>>740
格付けなんて意味ないのでは?適材適所でしょ。

742 名前:nobodyさん mailto:sage [04/11/08 00:10:15 ID:???]
>>740
flockを使う奴は素人だといいたいのか〜(w

743 名前:nobodyさん mailto:sage [04/11/08 00:30:26 ID:???]
>>740
KENTは素人じゃないといいたいのか〜(w

744 名前:nobodyさん [04/11/08 13:12:26 ID:BIj8xOyZ]
最終兵器ロックオン・レーザー搭載!

「一度捕まえたら、離さない・・・・・」

TAITOの名作シューティングRAY・FORCEができるのは
セガサターンだけ!

745 名前:740 mailto:sagePerl歴4ヵ月PHP歴28日 [04/11/08 21:24:24 ID:???]
いや…そういう訳じゃ…

746 名前:nobodyさん mailto:sage [04/11/08 23:46:08 ID:???]
cmpxchg最強

747 名前:nobodyさん mailto:sage [04/11/09 03:55:57 ID:???]
>>744
レイヤーセクションじゃなかったっけ?



748 名前:nobodyさん mailto:sage [04/11/09 07:25:54 ID:???]
>>740
flock>>>>>越えられない壁>>>>>rename=symlink>>mkdir

749 名前:nobodyさん mailto:sage [04/11/09 08:59:34 ID:???]
flockはNFS介して使うと壊れるから糞

750 名前:nobodyさん mailto:sage [04/11/09 13:16:33 ID:???]
激しくループしてるな。

751 名前:nobodyさん mailto:sage [04/11/09 13:43:34 ID:???]
ネタがファイルロックだけだから進展しようが無い

752 名前:nobodyさん mailto:sage [04/11/09 20:07:15 ID:???]
>>749
NFSを使った事無いので、良く分からないので教えてください。

NFSを利用する時はflock関数にflock(2)ではなくfcntl(2)を利用するように
perlをビルドすると思いますが、それでもロックは壊れるのでしょうか。
fcntl(2)で壊れる場合、実際の解決手段として、どのようなものがあるのでしょうか。

753 名前:nobodyさん mailto:sage [04/11/10 00:42:16 ID:???]
>>752
Maildir

754 名前:nobodyさん mailto:sage [04/11/10 01:28:10 ID:???]
>>753
djb 厨ってホントにいつも頭使わずに発言するなあ。

755 名前:nobodyさん mailto:sage [04/11/10 21:25:46 ID:???]
>>753
それは、ロック機構が無くても信頼できるメールボックスの話だと思うのですが、
一般的なファイルアクセスにも使えるのでしょうか。

756 名前:nobodyさん [04/11/12 07:07:11 ID:djvAfFkI]
>>747
レイフォース >>>> 越えられない壁 >>>> レイヤーセクション

757 名前:752 mailto:sage [04/11/13 13:06:05 ID:???]
調べてみたところ、
・NFS Version4なら、ロック機構が組み込まれているので問題が無い(flock(2)でok?)
・NLM(Network Lock Manager)プロトコルに対応したサーバとクライアントならば、
fcntl(2)で対応可能。(ただし、一部のシステムで信頼が無いかも)
・それ以外はロックファイルを作るのが一般的
という感じらしいことが分かりました。
ありがとうございました。



758 名前:nobodyさん [04/11/13 15:51:42 ID:6imth/Ie]
>756

レイストーム >>> レイフォース >>> レイクライシス

759 名前:nobodyさん mailto:sage [04/11/14 12:08:06 ID:???]
レイフォース=ガンロック >> php >> perl >> レイヤーセクション >> レイストーム / レイクライシス

760 名前:nobodyさん mailto:sage [04/11/15 01:32:31 ID:???]
なんか、SIMPLE1500のTHEダブルシューティングが欲しくなってきたw

761 名前:nobodyさん [04/11/18 09:27:07 ID:upfr9/ei]
>>760
それなに?

762 名前:nobodyさん [04/11/18 10:10:24 ID:3NzX+MnA]
俺もレイ・フォースは好きだったな
懐かしい

763 名前:nobodyさん [04/11/18 19:52:46 ID:GLzLqJbZ]
>>762 同意。

764 名前:nobodyさん mailto:sage [04/11/18 20:49:35 ID:???]
おめーらロックすんぞ

765 名前:nobodyさん [04/11/27 15:36:14 ID:o5xdYnQz]
ファイルロックって読み込むときは必要無いの?

766 名前:nobodyさん mailto:sage [04/11/27 15:54:59 ID:???]
ロックするべ?

767 名前:nobodyさん mailto:sage [04/11/27 17:40:53 ID:???]
>>765
書き込みが行われず中身が固定のファイルなら不要



768 名前:nobodyさん mailto:sage [04/12/04 12:35:02 ID:???]
質問しに来たらすでに同じ質問してる人がいた。

>>765-767
サンクス

過去ログは見るもんだ。

769 名前:nobodyさん mailto:sage [04/12/04 19:37:01 ID:???]
それは過去ログって言わないけどな

770 名前:nobodyさん mailto:sage [04/12/20 07:41:20 ID:???]
追記モードのやつを読むときはいらないんじゃないの?
壊れてる可能性のあるところってバッティングしているときのだけでしょ?

771 名前:nobodyさん [04/12/20 14:13:21 ID:sskqg6P0]
phpとperlでflock関数でファイルロックをしてますが
現在1つのスクリプト中に複数の箇所でファイルロックを使ってます。
これらのファイルロックを全てやめて代わりに、
スクリプトの一番最初でダミーのファイルにロックをかけて
スクリプトの一番最後でロックを解除するようにして他のプロセスが
スクリプトを実行しているときはスクリプトの実行自体を順番待ちさせて
同時に複数のプロセスがファイルへの書き込みをできないように
変えようと思いますが、何か問題あるでしょうか?
1つ気になるのは、もしスクリプトの途中でexit関数等でスクリプトの実行が終了した場合は
自動的にダミーファイルのロックが解除されファイルも自動的にcloseされますか?

772 名前:nobodyさん mailto:sage [04/12/20 15:14:56 ID:???]
>>770
追記であろうがなかろうが書き込みはロックした上で行われるのなら
読み込みだけのときはロック不要。

773 名前:nobodyさん mailto:sage [04/12/20 15:30:20 ID:???]
>>771
プロセスが死ねばロックは解除される。
先頭と末尾でロックと解除をするようにするのはいいが、
パフォーマンス低下は明らか。

774 名前:nobodyさん mailto:sage [04/12/20 16:09:04 ID:???]
mod_perl や mod_php のときって
スクリプトの実行が終了してもプロセスは死なないと思うけど
mod_* がスクリプト中の flock の後始末を面倒見てくれるんですよね?

775 名前:nobodyさん mailto:sage [04/12/20 20:09:18 ID:???]
>>770
二つ以上のプロセスが同時に追記したら、データが混じる可能性があるし。

>>772
勧告ロックはそうはいかない。

>>774
PHPは面倒みてくれるけど、mod_perlのファイルハンドルは無理。
だから、IO::File,FileHandleモジュールなどを使う。
perl.apache.org/docs/1.0/guide/porting.html#Filehandlers_and_locks_leakages

776 名前:770 mailto:sage [04/12/20 21:19:18 ID:???]
>>772
ロックしなくて読んでいいのは、追記モードのときだけではないの?
上書きモードだと一旦中身が空になるわけで、そのときロックしないで
読んでしまったらだめだよね?

読み込んで、それをそのまま出力しておしまいな 2ch の read.cgi
みたいなやつならそういうアプローチもいいだろうけど、読んだデータ
を処理に利用する場合はだめと思う。

>>775
>>770 のやつ 「書込時にちゃんとロックする前提で」っていうのが抜けてた。スマソ


777 名前:771 [04/12/20 21:25:49 ID:sskqg6P0]
>>773
回答ありがとうございます。
やっぱパフォーマンスの問題になりますか…



778 名前:nobodyさん mailto:sage [04/12/20 21:25:58 ID:???]
>>776
ロックして書き込み中は読み込もうとしてもアクセスできないだろ。

779 名前:nobodyさん mailto:sage [04/12/20 22:28:54 ID:???]
>>776
追記モードでも、書き込み途中の中途半端なデータを読む可能性を考えればダメでは?

780 名前:nobodyさん mailto:sage [04/12/20 23:16:39 ID:???]
>>778 なこたぁない。。

>>779
そだね

けちろん: 読み込みデータがハンパでもいいタイプのシステムなら
ロックは無用。読み込みデータがその後のデータに関わってくるのなら
ロック白

781 名前:nobodyさん mailto:sage [04/12/20 23:47:40 ID:???]
>>778
ロックの掛け方による

>>779
例えば固定長なら書込み途中のデータを見分けて使わない機構とかできそうな予感がするな?

>>780
そのけつろんは読みの場合限定ってことで

782 名前:nobodyさん mailto:sage [04/12/21 06:25:34 ID:???]
>>778
アドバイザリロックはいくらでもロックを無視できる。

783 名前:  [05/02/02 14:16:34 ID:hfbAK0ph]
 

784 名前:nobodyさん mailto:sage [05/02/26 07:20:55 ID:???]
ロック状態を保持するデーモン作る


785 名前:nobodyさん [2005/03/27(日) 21:58:07 ID:frr01O3q]
それ最強

786 名前:nobodyさん [2005/03/28(月) 02:50:20 ID:QWQNdIyl]
ユーザ名とロックIDを引数にしてロック状態の設定、解除、状態取得を行えるCGIサービスを誰かやって!
もちろん無料で( ̄ε ̄@)」

lock.service.jp/lock.cgi&user=xxx?id=1?timeout=60
lock.service.jp/status.cgi&user=xxx?id=1
# <html><body>OK</body></html>
# <html><body>NG</body></html>
lock.service.jp/unlock.cgi&user=xxx?id=1

こんな奴


787 名前:nobodyさん mailto:sage [2005/03/28(月) 03:17:29 ID:???]
>>786
実在のドメインを例示に使うなと何度(ry



788 名前:nobodyさん mailto:sage [2005/03/28(月) 03:50:52 ID:???]
( ̄ε ̄@)

789 名前:nobodyさん [2005/03/30(水) 16:45:20 ID:0SN1W7SJ]
二つ以上のファイルをflockしても問題ないんですか?
flock(FH, 2);
flock(FH2, 2);


790 名前:nobodyさん mailto:sage [2005/03/30(水) 17:17:26 ID:???]
>>789
ないよ。

# デッドロックには気を付けてね。

791 名前:nobodyさん mailto:sage [2005/03/30(水) 18:55:15 ID:???]
To: lock@xxxx.xx.xx
Subject: Lock

user=xxxx
pass=xxxx
timeout=60
lock-id=1
==========
Subject: Unlock
==========
Subject: Status

こんな感じのメールでロック状態を管理してくれるサービスきぼんw


792 名前:nobodyさん mailto:sage [2005/03/30(水) 19:01:47 ID:???]
伝書鳩 (ry

793 名前:nobodyさん mailto:sage [2005/03/31(木) 04:46:07 ID:???]
>>792
それだ!

To: lock@xxxx.xx.xx
Subject: Lock

user=xxxx
pass=xxxx
timeout=60
lock-id=1
=======

登録してある住所にlock-id確認コードを郵送

登録ページからlock-id確認コードを入力


794 名前:789 mailto:sage [2005/03/31(木) 09:19:53 ID:???]
thnx>>790

795 名前:nobodyさん mailto:sage [2005/04/02(土) 05:31:48 ID:???]
rename $0 $0.tmp
perl $0.tmp
rename $0.tmp $0



796 名前:nobodyさん [2005/04/04(月) 15:59:12 ID:UmDaQFM/]
>>795
すげw


797 名前:nobodyさん mailto:age [2005/04/08(金) 17:32:31 ID:???]
ごめん、>>795のどこがすげwのか、解説してください?



798 名前:nobodyさん mailto:sage [2005/04/08(金) 19:48:39 ID:???]
自信をリネームとかできんのかな

799 名前:nobodyさん mailto:sage [2005/04/08(金) 21:23:04 ID:???]
リネームに失敗しても、他のプロセスがリネームしてるヤツがあれば実行する罠

800 名前:nobodyさん mailto:sage [2005/04/08(金) 23:18:53 ID:???]
書き込みの最中に死んだりするとデータ全部消えて無くなるな。仕方ないか。

801 名前:nobodyさん mailto:sage [2005/04/09(土) 19:52:50 ID:???]
>>800
ゆーあーばか

802 名前:nobodyさん [2005/06/06(月) 21:34:45 ID:nLjgLi0T]
sub create_lock {
  for ($i = 0; $i < 10; $i++) {#10回繰り返す
    return if link($0, $lock);#link関数でロックファイルが作成できれば終了
    sleep(1);#作れない場合は1秒スリープしてから再挑戦
  }
  print "BUSY";#10回以内にロックできない場合はBUSYと表示
  exit;#スクリプト終了
}

↑だとうまくいくのに、↓だとうまくいかないのは何ででしょうか?
↓ですとsleepを5回繰り返した後&error("BUSY")の処理をします。

sub create_lock {
  local($retry) = 5;
  # 1分以上古いロックは削除する
  if (-e $lockfile) {
    local($mtime) = (stat($lockfile))[9];
    if ($mtime < time - 60) {
      &unlock;
    }
  }
  while (!mkdir($lockfile, 0755)) {
    if (--$retry <= 0) {
      &error("BUSY");#5回以内にロックできない場合はBUSYと表示
    }
    sleep(1);
  }
  exit;
}

803 名前:nobodyさん mailto:なかな [2005/06/06(月) 21:38:25 ID:???]
あかさたなはまやらわあかさたなはまやらわあかさたなはまやらわあかさたなはまやらわあかさたなはまやりわあかさたなはまやらわあかさたなはまやらわあかさたなはまやらを

804 名前:nobodyさん [2005/06/06(月) 23:11:37 ID:pBVz6jtY]
>>802
よくわからんがmkdirに成功するとwhileループを抜けてすぐ
exitするからじゃないか?

それ以外にも古いロックを削除するあたりが突っ込みどころ
ありそうだが、サブルーチンunlockがどういうものか示されて
ない以上は疑惑レベルだな。


805 名前:nobodyさん [2005/06/07(火) 11:44:43 ID:Jzx4SwvB]
なぜこれでロックがかかるのでしょうか?
フォルダを作って消してるだけのような気がするんですけど。


&createlock();#mkdirでロックファイルを作成する
open(FILE,"+<$logfile");
 〜(処理)〜
close(FILE);
&unlock;#rmdirでロックファイルを削除する

806 名前:nobodyさん mailto:sage [2005/06/07(火) 12:33:20 ID:???]
createlock と unlock の中身がわからないとなんとも・・・。


807 名前:nobodyさん mailto:sage [2005/06/07(火) 15:11:06 ID:???]
サーバー環境によって使えたり使えなかったりする関数の一覧みたいなのって
WEBに転がってませんかね?

環境  A  B  C
flock × ○ ○
mkdir ○ ○ ○

こんな感じの一覧表みたいなのがあればいいな



808 名前:nobodyさん mailto:sage [2005/06/07(火) 18:06:21 ID:???]
>>804
802です。お答えありがとうございました。
ごめんなさい、勘違いしてました。ちゃんとロックできました。
ところで、質問ですけども、

sub create_lock {
  local($retry) = 5;
  if (-e $lockfile) {
    local($mtime) = (stat($lockfile))[9]; # ←この部分の[9]
    if ($mtime < time - 60) {
      &unlock;
    }
  }
  while (!mkdir($lockfile, 0755)) {
    if (--$retry <= 0) {
      &error("BUSY");
    }
    sleep(1);
  }
  exit;
}

↑の文章の
local($mtime) = (stat($lockfile))[9];
特に[9]の意味が分からないのですが、この文章は何を意味するのでしょうか?

809 名前:nobodyさん mailto:sage [2005/06/07(火) 19:19:30 ID:???]
>>808
statはファイルの様々な情報を長いリストにして返す関数で、その9番目の
要素であるところのファイル更新時間だけ欲しいから[9]で取り出してると
いうことだな。詳しくはperldoc -f statでもしてくれ。







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

前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