5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

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

2 :2:02/06/23 10:27 ID:???
ずさー

3 :nobodyさん:02/06/23 10:38 ID:???
>>1は無能。学習意欲無し

       / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
∧_∧  | 君さぁ こんなスレッド立てるから          |
( ´∀`)< 厨房って言われちゃうんだよ             |
( ∧∧ つ >―――――――――――――――――――‐<
 ( ゚Д゚) < おまえのことを必要としてる奴なんて         |
 /つつ  | いないんだからさっさと回線切って首吊れ     |
       \____________________/

(-_-) ハヤクシンデネ…
(∩∩)

4 :nobodyさん:02/06/23 10:45 ID:???
いまさらねえ…
検索エンジンで調べればわらわら出てくるんですけど。

5 :nobodyさん:02/06/23 11:15 ID:eY2l+Gw1
ワラワラでてくるのよりいいのを考えようって言ってんだよ

6 :nobodyさん:02/06/23 11:36 ID:???
>>5
まずそのワラワラ出てくるやつを、利点、欠点と共に列挙してから始めようか
かぶると鬱だしな

7 :nobodyさん:02/06/23 11:39 ID:eY2l+Gw1
flock(対象ファイルを直接ロック)
ファイルロック関数flockを使用して対象のファイルを直接ロックする。
特徴
・速い。
・アンロックし忘れが無い。
・ファイル毎のロックに便利。
・処理全体をロックする場合には不向き。
・flockが使えない環境もある。

flock(ロック用ファイルをロック)
ファイルロック関数flockを使用して別途用意したロック用ファイルをロックする。
特徴
・速い。
・アンロックし忘れが無い。
・処理全体をロックする場合に便利。
・ロック用ファイルが常に残る。
・サーバーによってflockが使えない場合がある。

symlink
シンボリックリンク関数symlinkを使用してロック用のシンボリックリンクを作成し、 シンボリックリンクの有無によりロック状態を判断する。
特徴
・遅い。
・ロックしたままの状態(ロック用シンボリックリンク)が残る可能性がある。
・処理全体をロックする場合に便利。
・サーバーによってsymlinkが使えない場合がある。

mkdir
ディレクトリ作成関数mkdirを使用してロック用のディレクトリを作成し、 ディレクトリの有無によりロック状態を判断する。
特徴
・遅い。
・ロックしたままの状態(ロック用ディレクトリ)が残る可能性がある。
・処理全体をロックする場合に便利。
・どの環境でも使用できる。



8 :nobodyさん:02/06/23 11:40 ID:eY2l+Gw1

http://www1.plala.or.jp/bagi/labo/lock.html

9 :nobodyさん:02/06/23 11:47 ID:???





























10 :nobodyさん:02/06/23 11:48 ID:???
flock(対象ファイルを直接ロック)
ファイルロック関数flockを使用して対象のファイルを直接ロックする。
特徴
・速い。
・アンロックし忘れが無い。
・ファイル毎のロックに便利。
・処理全体をロックする場合には不向き。
・flockが使えない環境もある。

flock(ロック用ファイルをロック)
ファイルロック関数flockを使用して別途用意したロック用ファイルをロックする。
特徴
・速い。
・アンロックし忘れが無い。
・処理全体をロックする場合に便利。
・ロック用ファイルが常に残る。
・サーバーによってflockが使えない場合がある。

symlink
シンボリックリンク関数symlinkを使用してロック用のシンボリックリンクを作成し、 シンボリックリンクの有無によりロック状態を判断する。
特徴
・遅い。
・ロックしたままの状態(ロック用シンボリックリンク)が残る可能性がある。
・処理全体をロックする場合に便利。
・サーバーによってsymlinkが使えない場合がある。

mkdir
ディレクトリ作成関数mkdirを使用してロック用のディレクトリを作成し、 ディレクトリの有無によりロック状態を判断する。
特徴
・遅い。
・ロックしたままの状態(ロック用ディレクトリ)が残る可能性がある。
・処理全体をロックする場合に便利。
・どの環境でも使用できる。
flock(対象ファイルを直接ロック)
ファイルロック関数flockを使用して対象のファイルを直接ロックする。
特徴
・速い。
・アンロックし忘れが無い。


11 :nobodyさん:02/06/23 11:48 ID:???
要は複数のプロセスから共有できる資源があればいい。

12 :nobodyさん:02/06/23 11:48 ID:???
http://tohoho.wakusei.ne.jp/lng/199903/99030145.htm
とほほ 1999/03/30(火) 00:16:25
昔、UNIXのカーネルで飯を食っていました経験から判断すると・・・
(あくまでBSD系、SystemV系UNIXでの話です。NTは知らない。)

symlink, mkdir, flockはいずれも、ロックを『かける』ことに関して
は完璧。OSがちゃんと排他制御してくれる。

「symlinkで作られたファイルが在る状態でsymlinkを使う」って言う
のを、「symlinkが衝突する」と呼ぶのであれば、この「衝突」を検出
することによってロック権を奪ったか、奪えなかったかを判断している
のであり、衝突は正常動作の範囲。

symlinkとmkdirの違いは、mkdirだと、Windowsでも利用できるという
ことくらいしかない。信頼度は同じ。

ただし、symlink, mkdirはロックを『はずす』時に問題があり、ロッ
ク中にプロセスが異常終了したりすると、ロックファイルが残ったま
まになる。

その点、flockはロックを『はずす』時も完璧で、たとえプロセスが異
常終了しても、OSがストールしても、ロックが残ることは有り得ない。
信頼性ではsymlink, mkdirよりもflockの方が高い。ただしflockは、
UNIXでもサポートしていないOSがある。

しかし、flockでも(symlink, mkdirでも)ファイルが壊れることはあ
る。これは、ロック権を持ったプロセスが中途半端に書き込んでいる最
中に異常終了するなど、ロックとは無関係の原因で発生する。

もちろん、OSやperlのバグは考えていません。バグのことを考えても、
symlink, mkdir, flockのバグの発生頻度は同じようなものでしょう。


flock使えるんなら素直に使っとけ。

13 :nobodyさん:02/06/23 12:31 ID:???
なんで、お前らこんな単発スレにレスしてるんだ?コーディングスレあるだろ

14 :nobodyさん:02/06/23 12:44 ID:???
>>13
そんな事言ってるあなたも
なんで単発スレにレスしてるんだ?コーディングスレあるだろ

15 :nobodyさん:02/06/23 13:10 ID:???
>14
またまたぁ、そんなこといっちゃってー。
きみだって単発スレにレスしてるじゃん?コーディングスレあるだろ

16 :nobodyさん:02/06/23 13:34 ID:???
>15
そんなあなたも単発スレにレスしてるんじゃないの?コーディングスレあるだろ

17 :nobodyさん:02/06/23 13:59 ID:???
>>12
http://www.jp.qmail.org/q103/jman5/maildir.html
> NFSの実装によっては信頼できるロックをまったく持っていません。
なんてのもあるし、lockdが刺さったらしいという経験もあるんで、どうしてもflockは避けちまう。

18 :nobodyさん:02/06/23 15:11 ID:???
>>17
そんなあなたも単発スレにレスしてるんじゃないの?コーディングスレあるだろ

19 :nobodyさん:02/06/23 17:37 ID:eY2l+Gw1
http://tohoho.wakusei.ne.jp/soft/wlng.htm
コレのロックっていいんですか?

20 :nobodyさん:02/06/23 17:42 ID:???
>>19
またまたぁ、そんなこといっちゃってー。
きみだって単発スレにレスしてるじゃん?コーディングスレあるだろ


21 :nobodyさん:02/06/23 17:44 ID:???
ここが単発スレにレスしてるバカどもがいるスレですか?

22 :nobodyさん:02/06/23 19:15 ID:???
単発質問スレもウザいが、自治厨もウザい

23 :nobodyさん:02/06/23 19:51 ID:???
・単発質問スレ=無条件でゴミ
・単発スレ=スレが伸びればよし、伸びなければ自然消滅
区別しろよ。。。

24 : :02/06/23 21:26 ID:???
ロック用にファイルを1つ作っておいて、
ロック時に rename ってのはダメ?

if( rename( 元ファイル名, ロック中ファイル名 )){
  処理・・・・
}

みたいなのは


25 :nobodyさん:02/06/23 21:52 ID:???
>>24
ありだけど、mkdirやsymlinkと変わらん
プロセス死んだときの問題もね

26 :24:02/06/23 22:26 ID:???
>>25
ありがとう。mkdirやsymlinkはよく見かけるけど、renameってのは
みないから、おれが根本的になにか勘違いしてるのかと思ってました。

27 :nobodyさん:02/06/23 22:49 ID:???
>>24
またまたぁ、そんなこといっちゃってー。
きみだって単発スレにレスしてるじゃん?コーディングスレあるだろ


28 :nobodyさん:02/06/24 01:46 ID:???
>>24=26
http://www.google.co.jp/search?q=rename+%E6%8E%92%E4%BB%96%E5%88%B6%E5%BE%A1&ie=UTF-8&oe=UTF8&hl=ja&lr=

ん?renameだって普通にそこらへんにあるよ?


29 :nobodyさん:02/06/24 03:24 ID:???
>>248
またまたぁ、そんなこといっちゃってー。
きみだって単発スレにレスしてるじゃん?コーディングスレあるだろ


30 :nobodyさん:02/06/24 07:20 ID:???
http://www.google.co.jp/search?hl=ja&ie=UTF-8&oe=UTF8&q=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%AD%E3%83%83%E3%82%AF&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=


31 :nobodyさん:02/06/24 11:29 ID:???
>>30
またまたぁ、そんなこといっちゃってー。
きみだって単発スレにレスしてるじゃん?コーディングスレあるだろ


32 :nobodyさん:02/06/24 13:52 ID:???
Perlメモのロック処理をクラスで包んでみた。
特徴
・むちゃくちゃ遅い
・アンロックし忘れがない
・処理全体をロックする場合に便利
・どの環境でも使用できる

#Lock.pm
package Lock;
use strict;
use File::Spec;

sub new{
my($class, %opt) = @_;
my %lfh = (
dir => ($opt{lockdir} || $opt{dir} || 'lock'),
file => ($opt{lockfile} || $opt{file} || 'lockfile'),
timeout => ($opt{timeout} || 60),
trytime => ($opt{trytime} || 10),
);
$lfh{path} = File::Spec->catfile($lfh{dir}, $lfh{file});
for(my $i = 0; $i < $lfh{trytime}; $i++, sleep(1))
{
return bless \%lfh => $class if(rename($lfh{path}, $lfh{current} = $lfh{path} . time));
}
local *LOCKDIR;
opendir(LOCKDIR, $lfh{dir}) or return undef;
while(my $file = readdir(LOCKDIR)){
if ($file =~ /^$lfh{file}(\d+)/){
return bless \%lfh => $class if (time - $1 > $lfh{timeout}
and rename(File::Spec->catfile($lfh{dir}, $file) => $lfh{current} = $lfh{path} . time));
last;
}
}
closedir LOCKDIR;
return undef;
}
sub DESTROY{ rename $_[0]->{current} => $_[0]->{path};}
1;
__END__

33 :nobodyさん:02/06/24 14:36 ID:???
>>32
思うんだけど、どの環境でも使えるようにするにはrenameで統一、じゃなくて
BEGIN内で

BEGIN
{
if( find_out_if_flock_is_available() ) {
*_do_lock = \&_lock_flock;
} elsif( use_other_locking_mechanism() ) {
*_do_lock = \&_some_other_locking;
} else {
*_do_lock = \&_lock_rename;
}
}

みたいにしたらどうだろう(それじゃなきゃロックする関数内で何か
定数ををスイッチにしても同じだけど)。なんかrenameのロックとかって
イマイチ信用できんから、flock()が使えるならそれを使ったほうがよく
ない?



34 :nobodyさん:02/06/24 19:25 ID:kznFdEhQ
flockの方が糞

35 :nobodyさん:02/06/24 19:27 ID:???
処理全体をロックしたいばやいは

$lock = fopen('lock.txt', 'w') or exit;
flock($lock, LOCK_EX);

〜処理〜

fclose($lock);

でいいんでないかな。


36 :nobodyさん:02/06/24 21:15 ID:???
>>35
PHPかなんかか?それ。

37 :nobodyさん:02/06/24 22:01 ID:???
ファイルロックなんて必要なほどアクセスないからどでもいいけど、
タイムアウト処理ってどうやってる?
どの環境でも有効なタイムアウト処理となると思いつかんけどみんなは書いてる?


38 :nobodyさん:02/06/24 22:13 ID:v5EexGcz
KENTでいいや。

flock()は途中で死ぬとタイムアウトしないみたい(永遠にロック?)なんだけど、どうするべ?

39 :nobodyさん:02/06/24 22:21 ID:???
へ?flockはOSが後始末してくれると思ったけど

40 :nobodyさん:02/06/24 22:22 ID:???
>>38
俺もなんか以前(×人名)そんなことあったなー。
なんでだろ?

41 :nobodyさん:02/06/24 22:25 ID:???
まあもしflockが解放しないとしたら、シグナルハンドラでも
設定しておくしかないんじゃないの

42 :38:02/06/24 22:29 ID:???
わたしが見たソース(古い)
http://homepage1.nifty.com/glass/tom_neko/web/web_04.html

こんなことしてます。

eval {
local $SIG{ALRM} = sub { die "time out" }; # 時間が来たら抜け出す
open(OUT, "+< $datafile") or die;
alarm(5); # 先行プロセスを待つ時間(5秒)
flock(OUT, 2) or die; # ロック確認。ロック
alarm(60); # 自分自身の制限時間(1分)

一連の処理

close(OUT); # closeすれば自動でロック解除
alarm(0); # 無事済んだのでリセット
};
if ($@ =~ /time out/) {
タイムアウト時の処理
}
elsif ($@) { die }

43 :j064157.ppp.asahi-net.or.jp:02/06/24 22:29 ID:???
Windowsってさ、flock もできなけりゃぁ、タイムアウトもできないよね。

44 :nobodyさん:02/06/24 22:34 ID:???
ああ、これか。確かに見たことあるような。
まあ明日調べてみよう。

45 :nobodyさん:02/06/24 22:40 ID:???
>>43
NT系ならできるよぉ。

46 :nobodyさん:02/06/25 13:13 ID:???
>42
「古いロックファイル(ディレクトリ)の削除」の項で、作成時間が10分以上
前であることを確認したあとにリネームするのって複数プロセスでかち合う典型
だろ? このサイトの人ってそこんとこ理解しないで画期的とか書いてるYO!

http://homepage1.nifty.com/glass/tom_neko/web/web_04.html#deletelock

if ((-M $lockdir) * 86400 > 600) { # 作成時間が10分以上前なら
    rename($lockdir2, $lockdir);  # ロック入れ替え
    last;       # 一連の処理へ
}

47 :nobodyさん:02/06/25 13:45 ID:???
(゚Д゚)ハァ?

48 :nobodyさん:02/06/25 14:38 ID:???
>>45
NT系でalarm使える?
うちのActivePerl626ではunimplementedだよ…。

49 :nobodyさん:02/06/25 15:02 ID:???
flockがロックを解放しないのって、スクリプトが暴走して
プロセスが変な状態で生きてる時ぐらいじゃないのかな。
プロセスが完全に死んだら解放されると思うけど。
ま、暴走ってなんだって言われても困るが。

50 :nobodyさん:02/06/25 16:28 ID:+Rl2IvER
自作ロックを検証する方法ってどういうのがいちばん適切?

51 :fusianasan:02/06/25 16:36 ID:???
>50
ファイル追加書き込みを10000ループぐらい連続でやるスクリプトを
同時に複数プロセスから実行させて、書き込まれた行数で判断すれば?


52 :nobodyさん:02/06/25 17:04 ID:???
alerm使うよりLOCK_NB使えよ。

53 :nobodyさん:02/06/25 18:20 ID:???
alerm使うよりalarm使えよ

54 :nobodyさん:02/06/25 18:21 ID:???
(゚Д゚)ハァ?

55 :nobodyさん:02/06/25 21:07 ID:???
(OДO)ハァ!

56 :nobodyさん:02/06/25 21:15 ID:???
                 /\
                / ヽ\
               /  ヽ \             / \
              /    ヽ \__        / ヽ \
             /  ‐_ ヽ     ―――__/   ヽ \
            /        ̄           / __ ヽ \
           |                          ̄  \
           |                             |
           |        ||                   |
           |  ゝ_  |||/                  |
           |  ( ・ ブ       ゝ__       ┃ ┃   |
           |    ̄         ( ・ ̄ ̄ ブ   ┛ ┗  |
           |              ゝ__ ノ    ━┓ ┏  |   ┃ ┃
           |    __            ̄        ┃  |   ┃  ┃
           |     | ̄ ̄ーヽ                  |   ┃   ┃
           |     |     ヽ                 |
           |     |     |ヽ               |      ━┓
            \   _⊥_    |                |      ┃┛
             \      ̄ ̄ヽ_⊥               |      ┏━┓
              \                         |       ┏┛
               \                       /        ・


57 :nobodyさん:02/06/25 22:30 ID:???
スペルミスぐらい見逃してやれ

58 :nobodyさん:02/06/26 06:14 ID:???
板全体が殺伐としていますね・・

59 :nobodyさん:02/06/26 11:58 ID:???
                 /\
                / ヽ\
               /  ヽ \             / \
              /    ヽ \__        / ヽ \
             /  ‐_ ヽ     ―――__/   ヽ \
            /        ̄           / __ ヽ \
           |                          ̄  \
           |                             |
           |        ||                   |
           |  ゝ_  |||/                  |
           |  ( ・ ブ       ゝ__       ┃ ┃   |
           |    ̄         ( ・ ̄ ̄ ブ   ┛ ┗  |
           |              ゝ__ ノ    ━┓ ┏  |   ┃ ┃
           |    __            ̄        ┃  |   ┃  ┃
           |     | ̄ ̄ーヽ                  |   ┃   ┃
           |     |     ヽ                 |
           |     |     |ヽ               |      ━┓
            \   _⊥_    |                |      ┃┛
             \      ̄ ̄ヽ_⊥               |      ┏━┓
              \                         |       ┏┛
               \                       /        ・

60 :「このサイトの人」:02/06/26 17:34 ID:uIGx/rWA
>>46
>作成時間が10分以上
>前であることを確認したあとにリネームするのって複数プロセスでかち合う典型
>だろ?

コードをちゃんと読んでもらえれば分かりますが、ロックファイルを消すときの
排他のために、もうひとつ違うロックファイルを作ってます。ということで冗談
のような方法なので「画期的」とふざけてみたわけで。第2のロックファイルが
残っても消せないのが欠点。

残ったロックファイルを消す方法で、いまのところ完璧だと思うのは、
http://www.din.or.jp/~ohzaki/perl.htm#File_Lock
のrename式じゃないかな。

61 :nobodyさん:02/06/26 17:45 ID:???

                          __,,:::=========:::,,_,__
                       ...‐''゙ .  `    ,_ `   ''‐...
                     ..‐´      ゙           `‐..
 ─┼─   /\        /                  ○   \
 ─┼─ /\/_.........;;;;;;;;;;;;;;;;::´      (⌒,)         .l      ヽ.:;;;;;;;;;;;;;;;;;;;;;;.................     |||
   │    / ゙゙       .'          ̄  ヽ __ , ─|       ヽ      ゙゙゙゙゙゙゙゙゙゙゙゙゙;;;;;;;;;;......。・ ・ ・
   |   /         /             ヽ       .|        ゙:                ゙゙゙゙゙;;;;;;
  ゙゙゙゙゙;;;;;;;;............        ;゙               ヽ     l           ゙;       .............;;;;;;;;゙゙゙゙゙
      ゙゙゙゙゙゙゙゙゙;;;;;;;;;;;;;;;;;.......;.............................          .ヽ   ./ ..................................;.......;;;;;;;;;;;;;;;;;゙゙゙゙゙゙゙゙゙     ____
 ::::日F|xxx・,`:::::::::::::::::: ゙゙゙゙タ.゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ヽ ./゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙!!゙゙゙゙゙ ::::::::::::::::::`'*[] H]. |[][]|:
 ::::日日II[][]'l*:::::::::::::::::: ノキli; i . .;, 、    .,,         .V   ` ; 、  .; ´ ;,i!!|iγ :::::::::::::::::::j;‘日/ .|[][]|::::
::::口旦 E=Д;‘`::::::::::::::::::::: /゙||lii|li||,;,.il|i;, ; . ., ,li   ' ;   .` .;    il,.;;.:||i .i| :;il|!!|;(゙ ::::::::::::::::::::::"‘、Дロ::::
  ::::Д日T† ;j;::::::::::::::::::::::: `;;i|l|li||lll|||il;i:ii,..,.i||l´i,,.;,.. .il `,  ,i|;.,l;;:`ii||iil||il||il||l||i|lii゙ゝ :::::::::::::::::::::::・;日日T::: 日::::
  ::::Hvv´+":::::::::::::::::::::::::  ゙゙´`´゙-;il||||il|||li||i||iiii;ilii;lili;||i;;;,,|i;,:,i|liil||ill|||ilill|||ii||lli゙/`゙ :::::::::::::::::::::::::´.'田#v[][]†~~†::::
   ::::v[]>:・'::::::::::::::::::::::::::     ゙`゙⌒ゞ;iill|||lli|llii:;゙|lii|||||l||ilil||i|llii;|;_゙ι´゚゙´`゙ ::::::::::::::::::::::::::+`:F|ロxxx::::
   ::::田#YYv、*;:::::::::::::::::::::::::::::::::::::::      ´゙゙´`゙``´゙`゙´``´゙`゙゙´´ ::::::::::::::::::::::::::::::::::::::::,,・、::日旦::::
     ::::ロ|=|E」vxxx:`l::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;:`+E| ∩v |=|::::


62 :nobodyさん:02/06/26 19:08 ID:???
>>60
flockがロックを解放しないというのは?

63 :fusianasan:02/06/26 19:33 ID:???
>60
全然わかってないねー。まだ気づかないの?



64 :「このサイトの人」:02/06/26 19:46 ID:uIGx/rWA
>>62
どの程度可能性があるのか分かりませんが、システムコール等が滞って、
プロセスが終了しなくなった状況を想定してみました。単に混んで遅く
なってる時に強制終了したらまずいですね。制限時間が1分は短かいかも。

要は、ロックファイルが残った時のように特別な場合です。そういう
方法もあるって事で紹介しましたが、実用性はあまり無いかもしれません。

65 :「このサイトの人」:02/06/26 19:57 ID:uIGx/rWA
>>63
たしかに、わたしが全然分かってないのかもしれませんが。
下記のどこに問題がありますか?

$retry = 5; # リトライ回数セット
while (!mkdir($lockdir, 0755)) { # 作成。出来なければ待つ
if (--$retry <= 0) { # 5回ダメなら
if (mkdir($lockdir2, 0755)) { # ロックを消すための排他
if ((-M $lockdir) * 86400 > 600) { # 作成時間が10分以上前なら
rename($lockdir2, $lockdir); # ロック入れ替え
last; # 一連の処理へ
}
else { rmdir($lockdir2); } # 部分ロック削除
}
&error("BUSY"); # あきらめる
}
sleep(1); # 1秒待つ
}

1.作成時間が10分以上前なら
この隙間には他のプロセスが入れないよう2つ目のロックファイルで排他してある。
2.ロック入れ替え

66 :fusianasan:02/06/26 20:08 ID:???
>65
リネームに成功したかどうか、結果を確認できていない。
もしAというプロセスが10分以上前と判断した状態でプロセスを次に渡して、
Bというプロセスがリネームまで成功してCというプロセスが$lockdir2を作って
しまったら、Aというプロセスもリネームできてしまいロックできないのでは?


67 :「このサイトの人」:02/06/26 22:17 ID:uIGx/rWA
>>66
なるほど。rename失敗までは考えていませんでした。
となると、プロセスAが$lockdir2を作り、かつrename失敗すると、
古い$lockdirと $lockdir2と両方が残りますね。デッドロックには
なりますが、次のプロセスは入って来れないんじゃないでしょうか?

「$lockdir2を消す」「$lockdirの作成時間を変える」をrenameで
いっぺんに行ってますが、$lockdir2 が消え$lockdirが更新されな
い、というrename失敗はあり得ますか?
あるいは、rename失敗時にはアトミックではなくなるとか?


68 :fusianasan:02/06/26 22:39 ID:???
>67
わかった?

プロセスA:作成時間が10分以上前と判断して処理を次へ渡す
プロセスB:作成時間が10分以上前と判断してリネームまで成功
プロセスC:$lockdir2を作成後、作成時間が10分以上前ではないからはじかれる
プロセスA:$lockdir2が存在するからリネーム成功


69 :fusianasan:02/06/26 22:47 ID:???
補足:

勿論、作成時間が10分以上前ではない場合に削除する処理になってはいるが
これもまた削除する前に処理を次へ渡してしまう可能性もあることを念の為に。


70 :nobodyさん:02/06/26 22:59 ID:???
                 /\
                / ヽ\
               /  ヽ \             / \
              /    ヽ \__        / ヽ \
             /  ‐_ ヽ     ―――__/   ヽ \
            /        ̄           / __ ヽ \
           |                          ̄  \
           |                             |
           |        ||                   |
           |  ゝ_  |||/                  |
           |  ( ・ ブ       ゝ__       ┃ ┃   |
           |    ̄         ( ・ ̄ ̄ ブ   ┛ ┗  |
           |              ゝ__ ノ    ━┓ ┏  |   ┃ ┃
           |    __            ̄        ┃  |   ┃  ┃
           |     | ̄ ̄ーヽ                  |   ┃   ┃
           |     |     ヽ                 |
           |     |     |ヽ               |      ━┓
            \   _⊥_    |                |      ┃┛
             \      ̄ ̄ヽ_⊥               |      ┏━┓
              \                         |       ┏┛
               \                       /        ・




71 :「このサイトの人」:02/06/26 23:51 ID:uIGx/rWA
>>68
あれ?
>プロセスA:作成時間が10分以上前と判断して処理を次へ渡す

>プロセスA:$lockdir2が存在するからリネーム成功
の間には他のプロセスは割り込めませんよ。
リネームを試みる前には$lockdir2がプロセスB等他を弾きます。
プロセスAがリネームを試みるのは一度だけ。

●作成時間が10分以上前の場合
プロセスA:ロックディレクトリ1に阻まれる(排他される)
プロセスA:ロックディレクトリ2を作成(排他)
プロセスA:作成時間が10分以上前と判断
プロセスA:$lockdir2が存在するからリネーム(ロックディレクトリ2をロックディレクトリ1に変換)(排他終了)
→プロセスBが割り込めるとしたらここだけ。しかもリネームが失敗した場合。
プロセスA:そのままロックに守られ排他が必要な処理
プロセスA:ロックディレクトリ1を消す

で、$lockdir2 が消え$lockdirが更新されない、というrename失敗
(こんなのあるの?)の場合だけプロセスBが割り込めます。

●作成時間が10分以上前ではない場合
プロセスA:ロックディレクトリ1に阻まれる(排他される)
プロセスA:ロックディレクトリ2を作成(排他)
プロセスA:作成時間が10分以上前でないと判断
プロセスA:ロックディレクトリ2を削除(排他終了)
プロセスA:&error("BUSY")でプロセス終了

72 :nobodyさん:02/06/27 12:25 ID:???
                 /\
                / ヽ\
               /  ヽ \             / \
              /    ヽ \__        / ヽ \
             /  ‐_ ヽ     ―――__/   ヽ \
            /        ̄           / __ ヽ \
           |                          ̄  \
           |                             |
           |        ||                   |
           |  ゝ_  |||/                  |
           |  ( ・ ブ       ゝ__       ┃ ┃   |
           |    ̄         ( ・ ̄ ̄ ブ   ┛ ┗  |
           |              ゝ__ ノ    ━┓ ┏  |   ┃ ┃
           |    __            ̄        ┃  |   ┃  ┃
           |     | ̄ ̄ーヽ                  |   ┃   ┃
           |     |     ヽ                 |
           |     |     |ヽ               |      ━┓
            \   _⊥_    |                |      ┃┛
             \      ̄ ̄ヽ_⊥               |      ┏━┓
              \                         |       ┏┛
               \                       /        ・




73 :nobodyさん:02/06/27 12:36 ID:???
                 /\
                / ヽ\
               /  ヽ \             / \
              /    ヽ \__        / ヽ \
             /  ‐_ ヽ     ―――__/   ヽ \
            /        ̄           / __ ヽ \
           |                          ̄  \
           |                             |
           |        ||                   |
           |  ゝ_  |||/                  |
           |  ( ・ ブ       ゝ__       ┃ ┃   |
           |    ̄         ( ・ ̄ ̄ ブ   ┛ ┗  |
           |              ゝ__ ノ    ━┓ ┏  |   ┃ ┃
           |    __            ̄        ┃  |   ┃  ┃
           |     | ̄ ̄ーヽ                  |   ┃   ┃
           |     |     ヽ                 |
           |     |     |ヽ               |      ━┓
            \   _⊥_    |                |      ┃┛
             \      ̄ ̄ヽ_⊥               |      ┏━┓
              \                         |       ┏┛


74 :nobodyさん:02/06/27 14:32 ID:???
                 /\
                / ヽ\
               /  ヽ \             / \
              /    ヽ \__        / ヽ \
             /  ‐_ ヽ     ―――__/   ヽ \
            /        ̄           / __ ヽ \
           |                          ̄  \
           |                             |
           |        ||                   |
           |  ゝ_  |||/                  |
           |  ( ・ ブ       ゝ__       ┃ ┃   |
           |    ̄         ( ・ ̄ ̄ ブ   ┛ ┗  |
           |              ゝ__ ノ    ━┓ ┏  |   ┃ ┃
           |    __            ̄        ┃  |   ┃  ┃
           |     | ̄ ̄ーヽ                  |   ┃   ┃
           |     |     ヽ                 |
           |     |     |ヽ               |      ━┓
            \   _⊥_    |                |      ┃┛
             \      ̄ ̄ヽ_⊥               |      ┏━┓
              \                         |       ┏┛
               \                       /        ・

75 :nobodyさん:02/06/27 17:02 ID:???
透明あぼーん面倒


76 :nobodyさん:02/06/27 17:20 ID:???
                 /\
                / ヽ\
               /  ヽ \             / \
              /    ヽ \__        / ヽ \
             /  ‐_ ヽ     ―――__/   ヽ \
            /        ̄           / __ ヽ \
           |                          ̄  \
           |                             |
           |        ||                   |
           |  ゝ_  |||/                  |
           |  ( ・ ブ       ゝ__       ┃ ┃   |
           |    ̄         ( ・ ̄ ̄ ブ   ┛ ┗  |
           |              ゝ__ ノ    ━┓ ┏  |   ┃ ┃
           |    __            ̄        ┃  |   ┃  ┃
           |     | ̄ ̄ーヽ                  |   ┃   ┃
           |     |     ヽ                 |
           |     |     |ヽ               |      ━┓
            \   _⊥_    |                |      ┃┛
             \      ̄ ̄ヽ_⊥               |      ┏━┓
              \                         |       ┏┛
               \                       /        ・




77 :nobodyさん:02/06/27 20:25 ID:???

      \∧_ヘ     / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ,,、,、,,, / \〇ノゝ∩ < 1000取り合戦、いくぞゴルァ!!       ,,、,、,,,
    /三√ ゚Д゚) /   \____________  ,,、,、,,,
     /三/| ゚U゚|\      ,,、,、,,,                       ,,、,、,,,
 ,,、,、,,, U (:::::::::::)  ,,、,、,,,         \オーーーーーーーッ!!/
      //三/|三|\     ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
      ∪  ∪       (    )    (     )   (    )    )
 ,,、,、,,,       ,,、,、,,,  ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
      ,,、,、,,,       (    )    (    )    (    )    (    )



78 :「このサイトの人」:02/06/28 01:42 ID:lpc8XUFV
おかげさまで、rename失敗の場合について考える機会を持てました。
とりあえず結論出しておきます。

rename失敗の殆どの場合、何も起こらなかった、つまり古いロック
1とロック2 が両方残ることになるでしょうから、その時には他のプ
ロセスが侵入することはありません。

万一、ロック2が消え古いロック1が残ると排他は失敗しますが、そ
の場合、ロック2のディレクトリが消失したか、違う名前にrenameさ
れたことになりますね。ファイルシステムのエラーによって、絶対
起こらない事とは言えませんが、そこまで考慮する必要があるのか
どうかは疑問。

疑問ではありますが、あえて考慮するなら、上記のわたしの排他制
御で、
rename($lockdir2, $lockdir) or &error("LOCK ERROR");
として、rename失敗したプロセスを、その時点で終了させることに
すれば問題なくなります。

ごく稀にロック2が残る可能性は残りますが、ロック1が残る可能性
より低いのですから、残存ロック削除機能付きの排他方法として、
それなりに使えるのではないかと。

では。

79 :nobodyさん:02/06/28 09:45 ID:???
>>78
興味深い話題をありがとー

80 :nobodyさん:02/06/29 07:01 ID:???
           キ・ム・チッ!
               ∧∧
     |\       <ヽ`∀´>         /|
     ヾ  ̄ ̄ ̄ ̄ ̄    ̄ ̄ ̄ ̄ ̄ ̄ ̄ /
       ̄ ̄ ̄ ̄ ̄ ̄|  | ̄ ̄ ̄ ̄ ̄ ̄ ̄
               |   |
        / ̄ ̄ ̄ ̄\/ ̄ ̄ ̄ ̄ ̄\
       __/ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ .\__  ドドン!!
___<__)__________ (__>___




81 :nobodyさん:02/06/29 07:19 ID:???
ここの板の住人の文って句点が多いな。
改行しないヤシまでいるし。

82 :nobodyさん:02/06/29 17:52 ID:6eV+0rAg
根本的なことだけど、ファイルロックをサポートしていない
OSってどれくらいあるのよ? まさかWindows9xをWebサーバ
にするって話なの?


83 :&r:02/06/29 17:56 ID:???
>82
UNIX系にも一部あるそうですが…。

84 :nobodyさん:02/06/29 18:19 ID:/fhUzoY0
NFSやらラウンドロビンやら使った大規模なサーバシステムのプロバイダの
サーバって、flockが効かなかったりするわけ。

85 :nobodyさん:02/06/29 21:11 ID:Nqaw2LrM
OSというかプロバイダによってはflockがうまくいかないんでそ

86 :nobodyさん:02/06/30 00:13 ID:naYSzTIE
リムネットは使えませんね。
http://www.rim.or.jp/support/guide/homepage/cgi/index2.html

87 :nobodyさん:02/06/30 00:20 ID:???
Unix系ではflock()が使えない方が少数派なんだから素直にflock()すれば良い。
どうしても移植性を持たせたいならconfigure/Makefile.PLでもつければ良い。

88 :nobodyさん:02/06/30 04:05 ID:???
そこいらのプロバイダのWebスペースやレン鯖はflock使えないとこ
多い印象がありますが。

89 :nobodyさん:02/06/30 04:45 ID:???
要は誰がどこで使うCGIかだよね。
素人が設置する事の多いアクセスカウンターや掲示板やチャットなら、
flockが使えるかどうかなんて気にせずに、どこでも使えるロックファイル式
にしたいな。

90 :nobodyさん:02/06/30 05:37 ID:???
選択式にすればいいだけじゃん?

1 symlink
2 mkdir
3 flock
4 rename

91 :nobodyさん:02/06/30 07:57 ID:YjReV7q7
>>90
選択肢を増やしても、素人さんがつかうときに迷うだけじゃないの?
選ぶ基準はなに?


92 :nobodyさん:02/06/30 10:18 ID:???
えー、結局、そもそも素人が作る程度のCGIに
本当にそんな強固なファイルロックが必要なのかと…
そんだけアクセスあるんかいと…
ログが壊れてもそこそこのバックアップで復旧できるレベルの
CGIじゃないんかと…

93 :nobodyさん:02/06/30 11:01 ID:???
CGIの中で、flockが使えるか自前で判断して切り替えるのは?

94 :nobodyさん:02/06/30 16:11 ID:???
>>93
flockが必ずエラーになるとか全く機能しないなら簡単だけど、
以前の@niftyでは、flockが「突然」壊れるって症状だったので、
自動判別は難しいかも。flockしたサーバと違うサーバで動く
プロセスがだめなのかな?
NFSなのかラウンドロビンなのかその他の複数サーバシステムなのか、
CGI側で判別できましたっけ。
@niftyは最近サーバがZeusに変わって、今の所flock使えてますが。

95 :nobodyさん:02/06/30 16:49 ID:???










     ここはわざわざスレッド建てないとファイルロックが解らない馬鹿共の集うスレ











96 :nobodyさん:02/06/30 18:12 ID:???

単にファイル読みこむだけならロックしなくても大丈夫ですよね?


97 :nobodyさん:02/06/30 18:33 ID:???

つーかflockもsymlinkも使えない鯖なんてそう無い
Windows鯖使ってるところなんて・・


98 :nobodyさん:02/06/30 19:16 ID:???
>>97
だ か ら 、 あ る ん だ っ て ば 。
symlinkは大抵つかえると思うけど。

>>93
それってルーチンに組み込むってこと?そりゃマズーじゃない?(毎回余計な処理が増える)
チェック用CGIを添付しといて先にチェックしてもらうのいいかも。

汎用性考えるとmkdirをデフォルトにしとくのがいいと思う。mkdirできない鯖ってない・・でしょ?

99 :japh ◆J.5V8ta6 :02/06/30 20:47 ID:???
>>96
誰も読み込まない確信があるならのなら大丈夫。



100 :nobodyさん:02/06/30 20:48 ID:???
>>98

じゃあflockとsymlinkでいいじゃん


101 :nobodyさん:02/06/30 20:58 ID:???
>>99

どういう意味?


102 :nobodyさん:02/06/30 21:12 ID:???
ネタニマジレス(・∀・)カコイイ!!!

103 :japh ◆J.5V8ta6 :02/06/30 21:29 ID:???
>>101
別のプロセスが書き込んでる最中に読むと、
壊れたデータを読む羽目になることがある

それを防ぐのが共用ロック:


use Fcntl qw(:flock);
open IN, "foofile" or die "ファイルが開けませんな($1)";
flock IN, LOCK_SH | LOCK_NB or die "誰かが書き込んでいる最中ですな($1)";

104 :nobodyさん:02/06/30 21:37 ID:???
>>103

書き込み処理だけロックしとけば大丈夫だよね?


105 :nobodyさん:02/06/30 22:36 ID:???
>>104
たぶんダメ

106 :nobodyさん:02/06/30 23:00 ID:???
最初から最期までロックしとけ

107 :nobodyさん:02/07/01 01:23 ID:???
flockって別のロックファイルで2つ同時に使うことできる?

open(ONE, "> one.lock");
flock(ONE, 3);
open(TWO, "> two.lock");
flock(TWO, 2);
print TWO "two";
close(TWO);
print ONE "one";
close(ONE);
↑こんな感じに

108 :nobodyさん:02/07/01 01:41 ID:???
>107
それでロックしてるの? もっと基本から確認してみては?

109 :nobodyさん:02/07/01 02:01 ID:???
>>107
ヴァカハケーン!!

110 :nobodyさん:02/07/01 02:23 ID:???
>>107
flockは一回でいいんだよ。
あとは検索してやり直せ。

111 :nobodyさん:02/07/01 02:27 ID:???
>110
おまえも気づけYO!

112 :nobodyさん:02/07/01 22:52 ID:???
面白いの見っけ。
http://tako.2ch.net/test/read.cgi?bbs=perl&key=963036704&st=33

113 :nobodyさん:02/07/02 12:38 ID:3nOaRL0G
みれない

114 :nobodyさん:02/07/02 17:44 ID:???
こっちで
http://natto.2ch.net/perl/kako/963/963036704.html

115 :nobodyさん:02/07/04 16:41 ID:???
哲学者がスパゲティ食べているスレはここですか?

・・・と煽ろうと思ったら,レベルの低いスレだったのね.失礼.

116 :Hideki ◆wtRzKEV2 :02/07/09 09:11 ID:???
mkdirでやってみたんですが、以上終了してディレクトリーが残っていたら、
3秒で消し去るのって問題ありでしょうか?

とほほとか見て作ってみたんですけど指摘があればお願いします。

(my $mode, my $file, @_) = @_;

while(!mkdir("$file.lock", 0755))
{
sleep(1);
rmdir "$file.lock" if(time - (stat "$file.lock")[9] > 3);
}

open(DATA, "$mode$file");
print DATA @_;
close DATA;

return rmdir "$file.lock";


117 :Hideki ◆wtRzKEV2 :02/07/09 09:12 ID:???
age

118 :nobodyさん:02/07/09 09:31 ID:zyHRUAZm
21 名前:  投稿日:2002/06/03(月) 22:01
始めて裁判見てきたけど、ひろゆきって2chでの中傷について、「おいらは第三者だもんねー」ってな主張してたけど、裁判官に一喝されてた。
どうもひろゆきが企業の中傷を禁止してないことと、削除依頼を自分の意思で突っぱねたことで、当事者と判断されてる感じ。
でも裁判官も他の掲示板と2chは同じには扱っていないみたいだったから、他の掲示板には影響ないと思うけど。
それにしても、ひろゆきの顔はイベント板のタイトルに使ってる写真と全然違うのに驚いた。
あの写真は「勝負写真」なんだろうけど、あれじゃ詐欺だよ。
実物は深海魚みたいな顔だった。

119 :nobodyさん:02/07/09 16:05 ID:???
>>116
はなしにならん。きみには失望させられたよ。

120 :Hideki ◆wtRzKEV2 :02/07/09 18:23 ID:upY+9e5f
119>> 指摘して。

121 :nobodyさん:02/07/09 18:54 ID:???
>>Hideki ◆wtRzKEV2
指摘する前に質問させてくれ。
これはソースの一部分か? どうみても独立したソースじゃないよな。
なぜファイルロックにmkdirが有効なのか理解できてるのか?

122 :Hideki ◆wtRzKEV2 :02/07/09 20:00 ID:upY+9e5f
>>121 ファイルを書き込むためのサブルーチンです。&writeFile('>', 'abc.txt', 'ABCDEF')
みたいに渡す構成です。
mkdirを使えば
-> OS処理なので2つのプロセスが両方とも実行ができない。(Windows, UNIXで使える)
-> mkdir以下のコードはひとつのプロセスが実行する保証が得られる
-> mkdirできない間(rmdirが実行されるまで)は他のプロセスは待つ
-> mkdirできれば、ファイルを書きに行く。
-> もし異常終了か何かでロックディレクトリーが残っていれば3秒以上経った物は不正なロックとして強制削除。ファイルを書きに行く。
という構成で書いたのですが、どこら辺が話にならないのでしょうか?説明お願いします。

123 :nobodyさん:02/07/09 20:14 ID:???
>>Hideki ◆wtRzKEV2
ファイルロックを実行して、目的のファイルデータを読み書きするのに要する
時間は処理の混み具合によっては3秒以上かかる可能性もある。もし3秒以上
処理にかかったら他のプロセスにデータを壊される可能性あり。
ファイルロック以外の部分でも書き込み途中でシステムがダウンしたらデータが
壊れる可能性もある。

124 :Hideki ◆wtRzKEV2 :02/07/09 20:56 ID:???
> 時間は処理の混み具合によっては3秒以上かかる可能性もある
秒数で攻めたらいたちごっこですね。
壊す危険を冒すよりは、書き込みを中止する方がいいかもしれませんね。
> 途中でシステムがダウンしたら
そりゃopen後書き込む前に刺さりゃー、何のロックしても無駄ってヤツだ。

125 :nobodyさん:02/07/09 22:36 ID:???





          Hideki ◆wtRzKEV2 を叩くスレはここ?






126 :japh ◆J.5V8ta6 :02/07/09 23:02 ID:???
う〜む。>>116のロックの考え方自体はそれほど悪いモノではないと思えるのだが。
暇な時に耐久テストでもしてみるか…。


127 :nobodyさん:02/07/09 23:05 ID:???
>>124
そう思うならそれで良い、どれだけデータの安全と整合性を保障したいかだから。
そう言う人が秒間50アクセスのDBを管理するなんて事も珍しいでしょうし。

取り合えず
statの取得とrmdirがシステムコールレベルでアトミックになされる保障は
何処にも無い。
消そうとするロックディレクトリが正常かどうかの判断が出来ていない。
よって
>rmdir "$file.lock" if(time - (stat "$file.lock")[9] > 3);
この行は有っても無くても同じ

128 :nobodyさん:02/07/09 23:07 ID:???
本気な人がまた・・・
基本的に動作と確認が一発で出来る様な
アトミックなシステムコールを使わなきゃ駄目です。

ifで調べてから、動作なんてその間一万年掛かるかも知れないし

129 :Hideki ◆wtRzKEV2 :02/07/10 00:11 ID:???
説明どうもありがとうございました。出直してきます。

130 :nobodyさん:02/07/10 00:16 ID:???
なんだ、あっさり玉砕か。( ´_ゝ`)ププッ

131 :Hideki ◆wtRzKEV2 :02/07/10 00:22 ID:???
正直毎秒50アクセスに耐えうるまでの別次元の設計は要らない。
同次元の突込みが無いので自分のためのスクリプトしては問題は無いと思った。
つーか、てめーはだれだ!ププッじゃねぇぞ、コルゥァ!

132 : :02/07/10 00:34 ID:???
>>124
>> 途中でシステムがダウンしたら
>そりゃopen後書き込む前に刺さりゃー、何のロックしても無駄ってヤツだ。
この考え方からしてまだまだだよな。元データを壊さない工夫がないって言い
たかったのに…。

133 :Hideki ◆wtRzKEV2 :02/07/10 00:35 ID:???
> まだまだだよな
そうです。まだまだこれからです。まだ若いので。

134 : :02/07/10 00:49 ID:???
>>133
おおー。まだいるんか。
も1つヒントというか助言だが、mkdir より symlink または rename が
いいと思うぞ。なぜかと言うと mkdir より軽いからだ。なぜ軽いかというと
ファイルシステムを勉強すればわかる。
ただし、symlink は環境によっては使えないから rename を使ったほうがい
いということだ。
最後に、プロは完璧に近いものをストックとしていくつかもっているけど
ここじゃ披露する気にはなれないということを言っておこう。

135 :nobodyさん:02/07/10 00:49 ID:???
なんだ、あっさり玉砕か。( ´_ゝ`)ププッ

136 :nobodyさん:02/07/10 00:49 ID:???
なんだ、あっさり玉砕か。( ´_ゝ`)ププッ

137 :nobodyさん:02/07/10 00:49 ID:???
なんだ、あっさり玉砕か。( ´_ゝ`)ププッ

138 :nobodyさん:02/07/10 00:50 ID:???
なんだ、あっさり玉砕か。( ´_ゝ`)ププッ

139 :nobodyさん:02/07/10 00:53 ID:???
駄目駄目な実例。突っ込みどころ満載です。
http://www2q.biglobe.ne.jp/~terra/cgi/lockfile.htm

140 : :02/07/10 00:57 ID:???
>>139
ユーモアのあるページだなぁ。この人は基本的な関数の実行結果の真偽を
使うことも知らないのか…。
こういうページが氾濫しては…。

141 :nobodyさん:02/07/10 02:06 ID:???
>>139
dat 落ち前に読んでおけ

http://pc.2ch.net/test/read.cgi/sec/1025671013/349-

142 :nobodyさん:02/07/10 02:35 ID:???
ファイルなんて使わんと DBMS 使えばよろし

143 :nobodyさん:02/07/10 02:59 ID:???
>>142
DBMSがファイル使ってないとでも思ってんのかage

144 :nobodyさん:02/07/10 03:04 ID:???
ここは面白いひとが多いなあ。(◎◎;
ブログラマにはギャグセンスも必要っと φ(。。) メモメモ

145 :nobodyさん:02/07/10 03:22 ID:???
>>142
DBは禁句だろ。

146 :nobodyさん:02/07/10 10:54 ID:???
>>143
(゚Д゚)ハァ? >>142が言ってるのはファイルに直接アクセスなんかしないで
排他処理が元からきちっと実装されてるDBMS使えってことだろ。
まあDBMSが使えるサーバなんて限られてるしこのスレ的にはスレ違いだとは思うが。

147 :nobodyさん:02/07/10 15:23 ID:???
>>146
MySQLやらPostgreSQLが〜となるとたしかにアレだろうけど、
BerkleyDB とかなら OS 標準で入っていることも非常に多いし、
Perl からでも使えるしナー。

148 :115:02/07/10 16:43 ID:???
ツッコミが入らなかった・・・UNIX板へ帰ります

149 : :02/07/10 16:51 ID:???
> N人の哲学者が丸いテーブルに座っています.
> テーブルの真中には大きなスパゲティの皿が置いてあります.
> またN本のフォークがあって哲学者と哲学者の席の間に置いてあります.
> 哲学者は思索を続けていますが,お腹がすくと両側のフォークを取って
> スパゲティを食べます.お腹が一杯になると食べるのを止めてフォークを返します.
> 哲学者は紳士ですから,お腹が空いていても両方のフォークが手に入るまでは待ちます.

これか。このスレとは微妙に方向性が違うような。


150 :nobodyさん:02/07/10 17:38 ID:???
>>148
はっはっは!このスレのレベルの低さを思い知ったか!!

151 :nobodyさん:02/07/10 18:06 ID:???
>>147
BerkleyDBは排他制御やってねーだろ。

152 :nobodyさん:02/07/10 18:38 ID:???
>>151
MySQL が BerkleyDB の機能を使ってトランザクションを実現
しているくらいなのに、lock やってないわけなかろ。いつの
version の話してるの?

http://www.sleepycat.com/docs/reftoc.html
http://www.sleepycat.com/docs/ref/lock/intro.html
見て出直してこい。ちなみにこの document は 4.0.14 のだけど、
3.x のころからしっかり lock subsystem がある。

153 :nobodyさん:02/07/10 21:53 ID:???
>>152
OS標準で入ってるつーと
http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/db/README?rev=1.1&content-type=text/x-cvsweb-markup
とかVer 1だろ。
perlのDB_Fileで2や3も使えるけど、インターフェースは1でサポートされてる部分しか使えねーはずだが。

154 :nobodyさん:02/07/11 02:02 ID:???
>>153
http://search.cpan.org/search?dist=BerkeleyDB
使えば?

あと、FreeBSD では完全に標準な状態ではたしかにそうだけど、ふつう
ports で 3.x が入ってくるし、Debian でも完全に標準では 2.x でふつう
3.x、RedHat では完全に標準で 3.x が入る

155 :nobodyさん:02/07/11 04:50 ID:???
どうせロッキングするならクリティカルな場合も考えないといけないし、
それなら車輪の再発明は止めて最初からDBMSを使うべきというのは
反論しようのない正論。しかも、リソースのありかまで教えてくれているし。

ただ、こういう極めて的確な回答があると、この手のスレはつまらなくなるね…。

156 :nobodyさん:02/07/11 06:50 ID:???
>>155
それでも、ダラダラとレスしてる奴等がいるところを見るとこの板のレベルの低さが解るね

157 :nobodyさん:02/07/11 09:23 ID:???
また釣れた(・∀・)クスクス

158 :nobodyさん:02/07/11 11:11 ID:???
DBMSやflock等の飛び道具使えないときにどうするかというパズルじゃないの?

159 :nobodyさん:02/07/11 16:21 ID:???
つかperlのflockてatomicじゃないだろ

160 :nobodyさん:02/07/11 21:02 ID:???
flock(2)使うときのflockはアトミックでしょ。 lockfでエミュレートしてるのはヤヴァイの?

161 :nobodyさん:02/07/12 18:11 ID:???
# 初心者スレから誘導されてきました。

# 排他処理をしたいです。
# ローカル環境(WindowsMe+Apache+Cygwin付属のPerl)では成功するのですが、
# サーバで実行するときには、必ず失敗します(エラー表示部が実行されます)。
# もし落ち度がありましたらご教授ください。以下要所の抜粋です。
sub create_lock {
  my ($lockfile, $retry) = @_;
  while (!mkdir($lockfile, 0755)) {
    if (--$retry <= 0) {
      return undef;
    }
    sleep(1);
  }
  return 1;
}

sub remove_lock {
  my ($lockfile) = @_;
  rmdir($lockfile);
}

#上記関数の利用例
my $lock_handle = &create_lock("./lockfile", 5);
if (not $lock_handle) {
  &print_error($resource{writedatafailed});
}
#ここで処理する
&remove_lock($dir_lock);


162 :nobodyさん:02/07/12 19:10 ID:???
>>161
ディレクトリに書き込み権限がない。
既にロックされている(./lockfileが存在する)。
のどちらか。

&create_lock("./lockfile", 5);

&remove_lock($dir_lock);
のファイル名が…

163 :nobodyさん:02/07/12 19:38 ID:???
>>162
ご指摘ありがとうございます。(;ワ;)
今夜さっそくディレクトリの書き込み権限のチェックをしてみます。

えーと、下の $dir_lock は貼り付け時に直し忘れました(^^;)
混乱させてしまったようで、すみません。

あとでまた結果報告しにきます。

164 :161:02/07/13 07:51 ID:???
できました〜!
>>162さん、感謝です。助かりました。

165 :nobodyさん:02/07/18 03:33 ID:???
叩かれに来ました。

open(OUT, "+< outfile.txt");
flock(OUT, 2);
truncate(OUT, 0);
seek(OUT, 0, 0);
print OUT "........";
close(OUT);

の欠点を教えてください。
お願いします。

166 :nobodyさん:02/07/18 05:55 ID:???
>>165
いいんじゃないの?それでも別に。

167 :nobodyさん:02/07/18 13:34 ID:???
........吐くだけならロックしなくて良いじゃん

168 :nobodyさん:02/07/18 14:33 ID:???
>>167
じゃあ、二つのプロセスが同時に同じファイルに対して吐きにいったら
どうなる?

169 :nobodyさん:02/07/18 14:56 ID:???
open(OUT, "+< outfile.txt");
flock(OUT, 2);
seek(OUT, 0, 0);
print OUT "........";
truncate(OUT, tell(OUT));
close(OUT);

書き込みが終わってからtruncate()したほうが安全でちょっと速いみたい。

truncate(FILE, tell(FILE)) : 56 wallclock secs ( 8.21 usr + 39.26 sys = 47.47 CPU) @ 210.67/s (n=10000)
truncate(FILE, 0) 60 wallclock secs ( 8.43 usr + 42.72 sys = 51.15 CPU) @ 195.49/s (n=10000)

170 :nobodyさん:02/07/18 15:36 ID:???
どうもならないよ、定数吐き出すだけでしょ?
正確にはsyswriteするか$|=1してバッファ使わない様にした方が良いけど

171 :nobodyさん:02/07/18 15:38 ID:???
truncateしなくて良いじゃん変数じゃ無いのに
前提が変なのに何をどうしたいのやら


172 :nobodyさん:02/07/18 15:41 ID:???
どこに定数って書いてるんだ?

173 :fusianasan:02/07/18 16:45 ID:???
>>172
だれに言ってるんだ? わたしの記憶が確かなら>>170に定数って書いてるYO!

174 :nobodyさん:02/07/18 17:11 ID:???
この棘々しい会話の流れ
( > v<)ノ  タマンネー♪

175 :nobodyさん:02/07/18 17:30 ID:???
定数だろうが変数だろうが返り値だろうが関係ないわけですが

176 :nobodyさん:02/07/18 17:34 ID:???
>>175
は? 何言いたいのおたく?
もうちょっと日本語の文章力付けなさいよ


177 :nobodyさん:02/07/18 17:42 ID:???
みんなあまのじゃくさん♪


178 :nobodyさん:02/07/18 19:10 ID:???
すんげー荒れてるw

179 :nobodyさん:02/07/18 23:34 ID:???
この程度で荒れてるって言うのか。

180 :nobodyさん:02/07/18 23:43 ID:???
荒れてるというよりみんなすさんでるな。
漢字で書いたら一緒だけど。

ま、もう当分この板はこんな調子でしょ・・・。

181 :nobodyさん:02/07/19 01:05 ID:???
この板ってほんと殺伐系だね。馴れ合い一切なし。さっぱりしてて気持ちいいけどね。

182 :nobodyさん:02/07/19 01:29 ID:???
>>165
いろいろなレスがあるけど、flockつかえるなら、それでいいんだよ。
初心者板でそう言い返してこい。

183 :nobodyさん:02/07/19 02:38 ID:???
突然ですが、読むだけのオープンでもflockが必要なの?
他のプロセスとの関係とかあります?


184 :nobodyさん:02/07/19 02:45 ID:???
>>165

>>1参照。
どんな環境でもつかえてっていうのが、このスレの主題。
flockは環境によってはつかえない。
flockつかえるなら、それでいい。

185 :行番号でるかな:02/07/19 03:00 ID:???
>>183
01 open FH,"<./hoge";
02 my @hoge = <FH>;
03 close FH;
04 # @hogeを加工、比較的重い作業
05 open FH "+<./hoge";
06 flock (FH,2);
07 # 書き込み

2行目で配列に全部読み込んでいる、hogeの内容全部がオンメモリな状態。
今10個のプロセスが一斉に読み込みを行ったとする。
つまり10個のプロセス全てが同じ内容の@hogeを得る。
全てのプロセスが完了した時のhogeの内容はどれか一つの
プロセスの内容しか反映されて居ないだろう。


186 :183:02/07/19 03:17 ID:???
なるほど、了解しました。
どこかのサイトに読み込みオープンでもflockすべきだと
書いてあったのが気になっていたんですが、
そういう場合のことだったんですね。
ありがとうございました。

187 :nobodyさん:02/07/19 14:05 ID:???
ファイルロックなんでも相談室っぽい雰囲気になりそうだ

188 :nobodyさん:02/07/19 15:23 ID:H65klWUw
http://www.din.or.jp/~ohzaki/perl.htm#File_Lock

これじゃだめか?

189 :nobodyさん:02/07/19 15:44 ID:???
timeが全く同じだと、通常のrename式と同じ問題が生じる。
まあ、可能性ははるかに低くなると思うが。

190 :nobodyさん:02/07/19 15:48 ID:???
>>189
???????????????????????????????????????????????????

191 :nobodyさん:02/07/19 19:14 ID:g9uMB3Mk
>>189
同じtimeでも唯一のプロセスしかロックできないから大丈夫でない?
1秒内にロックを解除しないままプロセスが死んだ時ってこと?

192 :nobodyさん:02/07/20 21:32 ID:???
2chはflockか?

193 :nobodyさん:02/07/25 16:40 ID:Ong5dr5a
結局、実際の書き込みを、
1.ユニークなファイル名を作り書き込み。
2.指定のファイル名にrename
にしときなさいってこった。

194 :nobodyさん:02/07/25 17:54 ID:???
>>193
rename時に衝突することもあるってこった。

195 :nobodyさん:02/07/26 01:04 ID:???
ファイルロック完全にやって50点。
書き込み中のプロセス事故死に対応して100点。

196 :nobodyさん:02/07/26 02:18 ID:???
>>195
それでは認識が甘いな。

197 :nobodyさん:02/07/26 03:55 ID:???
&unlock if($lockkey);

sub unlock{
省略
}
この構文の意味がわからんから教えてくれ
unlock関数とif文が何で一緒になってるんだ?


198 :nobodyさん:02/07/26 05:36 ID:???
教えてくれ、だってさ教えてくれ!!
ちょっと聞いた奥さん教えてくれ!
ぷぷぷ

199 : :02/07/26 09:01 ID:???
>>197はマルチポスト

200 :nobodyさん:02/07/26 11:19 ID:???
ファイルロックって書き込み処理のときだけすればいいんですか?
読み込み処理のときにはしなくてもいいんですか?

201 :nobodyさん:02/07/26 11:27 ID:???
>>192
2ちゃんはflockでした

202 :nobodyさん:02/07/26 13:35 ID:NvB7dZaP
&unlock if($lockkey);

if($lockkey) {
  &unlock;
}

203 :nobodyさん:02/07/26 13:45 ID:???
>>197 && >>202
ファイルロックとは関係ないぞ。
Perl初心者スレへ。

204 :nobodyさん:02/07/28 16:44 ID:???
>>191
それでもタイムアウトまでは待つのでは?
あ、正常な処理中にタイムアウトを超えてしまった場合が問題なのかな?
完璧を追求するのなら。

205 :nobodyさん:02/07/29 14:41 ID:???
あげてわるいか!

206 :nobodyさん:02/07/29 14:47 ID:???
わるいっつったらどうするよ?

207 :nobodyさん:02/07/29 15:10 ID:???
>>206
あげたもんはさがるまで待つしかしょーがねーだろ?って開き直るよ。

208 :nobodyさん:02/07/29 15:15 ID:???
homepage1.nifty.com/glass/tom_neko/web/web_04.html
のページでロックの仕方が紹介されていたので使わせてもらおうと思いました。
で、「古いロックファイル(ディレクトリ)の削除」の項目にある、
$retry = 5; # リトライ回数セット
while (!mkdir($lockdir, 0755)) { # 作成。出来なければ待つ
  if (--$retry <= 0) { # 5回ダメなら
    if (mkdir($lockdir2, 0755)) { # ロックを消すための排他
      if ((-M $lockdir) * 86400 > 600) { # 作成時間が10分以上前なら
      # ロック入れ替え
      rename($lockdir2, $lockdir) or &error("LOCK ERROR");
      last; # 一連の処理へ
      }else{ rmdir($lockdir2); } # 部分ロック削除
    }
    &error("BUSY"); # あきらめる
  }
  sleep(1); # 1秒待つ
}
一連の処理
rmdir($lockdir); # 削除
とりあえず、これ使っておけば大丈夫なんでしょうか。
2ちゃんねるみたいな同時アクセスが凄い場所でない限り。

209 :nobodyさん:02/07/29 15:21 ID:???
>>207
別にわるかねぇよ。

210 :nobodyさん:02/07/29 15:24 ID:???
>>207
バグもあるけどキミんとこのアクセス数ならOK。

211 :nobodyさん:02/07/29 15:36 ID:???
>>210
どういう意味なんだ?

212 :nobodyさん:02/07/29 15:55 ID:yLhb3gGL
どこからダウンロードしたのか忘れたんだけど、
使ってるカウンター(Perl)見たら、

ロックファイル作成

ファイル読み込み

ロックファイル消す

カウントUP

ロックファイル作成

ファイルに書き出し

ロックファイル消す

といった流れになってたんだけど、初めのファイル読み込みの時にもロックは必要なの?


213 :nobodyさん:02/07/29 16:25 ID:???
>>219
とんでもねぇロックの仕方だな

214 :nobodyさん:02/07/29 16:27 ID:???
>>219
はとんでもないロックを出さなければいけない。

215 :nobodyさん:02/07/29 16:32 ID:???
219に期待sage


216 :nobodyさん:02/07/29 17:26 ID:???
>>219 はロッカー♪

217 :nobodyさん:02/07/29 17:33 ID:???
>>219
凄い。そんなアルゴリズムがあったのか。

218 :nobodyさん:02/07/29 17:35 ID:???
>>219ある意味で、とんでもないな。

219 : ◆JAPH9PWA :02/07/29 21:21 ID:???
unless(`ps` =~ /\Q$0\E/)
{
# ロック権を取得したので処理をする
}


220 :nobodyさん:02/07/29 22:11 ID:???
>>219
\Qと\Eの意味知らんけど、確かにとんでもないな

221 :nobodyさん:02/07/29 22:13 ID:???
Windowsでうごかねぇよ。

222 :nobodyさん:02/07/29 22:15 ID:???
他のプロセスを全てkillする排他制御はどうか

223 :nobodyさん:02/07/29 22:17 ID:???
>>222
最強だな、うん

224 :nobodyさん:02/07/30 03:13 ID:???
>>223
なんで最強なんだ? suEXEC ならどうする?

225 :nobodyさん:02/07/30 09:03 ID:???
httpdから何から、「全て」killするからでしょ。root限定で

226 :nobodyさん:02/07/30 09:52 ID:???
そんな真面目に考えなくても


227 :nobodyさん:02/07/30 11:37 ID:???
木村ロック

228 :nobodyさん:02/07/31 23:34 ID:EOzgSn6U
書き込み中にタイムアウトになるとログが壊れます?

229 :nobodyさん:02/08/01 02:00 ID:DTOpJumx
>>228に便乗
@open直後
Aprint直後
Bclose
A、A〜Bでしょうか?
でもopenでクリティカルな場合に吹っ飛ぶこと考えると…@?

230 :nobodyさん:02/08/01 03:58 ID:???
>>228
サーバの正常なタイムアウトなら、書き込みのシステムコールの
途中で止まったりしないでしょう。数回に分けて書き込んでたら、
止まるけど。サーバの容量制限に引っ掛かって止まる事もあるし。
>229
書き込むときに上書き(>)で開くと内容が消えるので、その直後に
止まったらアウト。

どうしてもログを守るんだったら、かならずtempファイルに書き
出して、書き込み成功を確認した後にrenameすることが必要。
ファイルサイズを計ってサイズが異様に小さいときは失敗だし、
内容をチェックすれば完璧。

これならrenameの瞬間に電源が切れるか、HDDがクラッシュする
くらいの事がなければ、壊れないはず。(バグは除く)
どのみち定期的なバックアップは必要かもね。

231 :229:02/08/01 13:35 ID:???
>>230
thnx
参考になりますた

232 :193:02/08/01 19:06 ID:W9oFKOXJ
>>194
だから〜。
処理ロックのファイルロックは当然かけておいて、
書き込み時はユニークファイル名に書き出してrename
ってこったよ。

233 :nobodyさん:02/08/02 01:01 ID:???
>>232
アマちゃんですね。

234 :nobodyさん:02/08/03 18:57 ID:???
http://www.google.co.jp/search?hl=ja&inlang=ja&ie=Shift_JIS&as_qdr=all&q=site%3A2ch.net+perl&lr=
>>1-233
この調子でがんばれ糞ども

235 :228:02/08/03 20:27 ID:npWjw1lc
230さま
たまにログファイルが途中でぶち切れちゃうんです
ファイルアップありだから
でかいファイルをアップロードした時に
途中でタイムアウトするのかと思ったんですが
そうでもないんですね・・・

open(DB,"+<$logdir$log_d") || &error('ファイルエラー error_24');
flock(DB, 2);
my @lines=<DB>;
unshift (@lines,$thred);
seek(DB, 0, 0);
print DB @lines;
truncate(DB, tell(DB));
close (DB);

これ問題ないですよね?
なんでだろ・・・
flock使えない鯖なんでしょうか?
他に原因は考えられます?

236 :nobodyさん:02/08/03 23:45 ID:???
>>235
でかいファイルを全部配列に入れるのは大問題だ

237 :228:02/08/04 07:59 ID:xc+iopog
>236
50件ずつにログを区切ってるんで
読み込んでるのは
書き込み50件分のデータです
スレッドのタイトル一覧も表示しないといけないし・・・

238 :228:02/08/04 08:03 ID:xc+iopog
やっぱ
flockが使えないんでしょうか?
それかtell(DB)の値がおかしくなることがあるのかな?

239 :nobodyさん:02/08/04 12:11 ID:???
>>235
> seek(DB, 0, 0);
> print DB @lines;
> truncate(DB, tell(DB));

先頭にseekした後に、truncate(FH, tell(FH)) したら当然ファイルサイズ0に
なるわけだが。

240 :230:02/08/04 12:57 ID:???
データが大きくないとしても、my @lines=<DB>が失敗してるのかも。
my @lines=<DB> or &error('読み込みエラー');
としてみては?
読み込んだ大きなファイルの方にメモリを食われてるのかもしれず。
システムコール(ここではファイル操作)は常に失敗の可能性を考えて
おいたほうがいいかと。flockやprintもね。

241 :nobodyさん:02/08/04 13:14 ID:???
>>235
もうちょっと問題切り分けた方が良いよ
マルチパートだと思うんだけど、変なモジュールを使って
データ千切れちゃってるとか。
Niftyはflock空振りサーバの代名詞だけど大丈夫?
適当にsleepしてウェイトかけながらテストするとか
シグナル関係全部無視するとか
基本的に共用ならサーバからkillされる様な使い方は
間違ってると思うよ
もし自分のなら、さっさとコネクション切ってじっくりと作業すれば
良いだけなんだけど
サーバのBBSとかFAQは読んでる?

>>239
それは print 〜 が有るから問題無い
と言う事で、一応。

242 :239:02/08/04 14:38 ID:???
>>241 正直、スマンカッタ。

243 :nobodyさん:02/08/04 15:21 ID:???
で、なにが最強なの?

244 :228:02/08/04 21:59 ID:etatASlj
レスありがとうございます
最初から書いとくべきだったんですが
説明を付け足すと
2chタイプの掲示板なんです
でログファイルへの書き込みはこの部分だけです
カウンターなんかも同じ方法で書き込みしてるんですが
それは飛んだことないんです
で、ログファイルへの書き込みが処理の最後の方なので
遅い回線でファイルアップした時にデータを送るのに
時間がかかり途中でCGIが止まる事があるのかな?
と考えてたのです(最後の方の処理のログファイルが影響受けやすいと)

でも、どういう条件でログが消えるのかは特定できてません
スレッド50件記録のうちの途中(全部じゃないです。例えば36件目とか)で
消えてしまいます(メッセージが途中までしかなかったり)・・・
(レスは別ファイルなのですが、そっちは消えません)

>読み込んだ大きなファイルの方にメモリを食われてるのかもしれず。
そういう制限もあるんですね試してみます
>もうちょっと問題切り分けた方が良いよ
でも、書き込みしてるのこの部分だけなんですよ
やっぱflockが使えなくて
他のプロセスの書き込み中のデータを読み込んでるとログが途中で消えますよね?
でも、カウンターは消えないんですよ・・・
(それともそのうち消えるんでしょうか?ファイルサイズが小さいから確率が低いだけ?)
>サーバのBBSとかFAQは読んでる?
すいません、その辺、勉強してきます

245 :nobodyさん:02/08/04 22:48 ID:???
>>244
一度flock以外のロックで試してみれば?
こういうのが問題を切り分けるって事じゃないのか。

246 :230:02/08/05 01:30 ID:???
データのどこで切れるかが重要。

1.flockが利かない場合は、まるっと新規発言が記録されないか、書
き込みの後のtruncateで半端な位置で切られるわけで、それぞれの
発言内容の量にさほど違いが無いなら、48〜50発言目くらいの後ろ
の方で切れるはず。

2.新規発言の処理に問題あるなら、unshiftで入れた1発言目(あとで
気が付いたなら数発言目)で切れるが、その後ろの発言まで消える事
は無い。

3.書き込みが全面的に失敗し、書き込まれて無いのに切り詰めれば
ログ丸ごと消える。(ずっとあとになって気が付けば36発言目になっ
てたりするが)

というわけで、36発言目で切れるなら問題は
1.読み込み(my @lines=<DB>)
2.書き込み(print DB @lines)
3.切り詰め(truncate(DB, tell(DB)))
の3個のどれかが失敗してると考えられるよね。それぞれ失敗時には
エラーにしないと。で、これらが失敗する原因は、メモリ使用量や
ディスク容量の制限、あるいはサーバの混雑にありそう。

途中まで書き込んでprintが失敗してるんなら、tempファイル式にす
るしか無いけど、まずは上記の対策してから。

247 :228:02/08/06 00:52 ID:eY1Nkha6
my @lines=<DB> || &error('読み込みエラー');
にしたら
最初の一行しか読まないんですが・・
すいません・・・

248 :nobodyさん:02/08/06 01:13 ID:???
評価順位って知ってる?
(@lines=<DB>)
その他力本願ぶりじゃ先は真っ暗っぽいね

249 :228:02/08/06 01:14 ID:HdiBMgeW
or にしたら
ちゃんと動きました
or と || とは違うんですか?
はぁ・・

250 :228:02/08/06 01:29 ID:AoKqt/pr
おお、わかりました
ありがとうございます

251 :nobodyさん:02/08/06 06:51 ID:???
>>248
ハァーーーーーーーー


眠たい

252 : :02/08/06 09:00 ID:???
>>251
何が眠たいんだ? 
my (@lines=<DB>) || &error('読み込みエラー');
で動いてるんだが、向学の為に教えて欲しい

253 : ◆JAPH9PWA :02/08/06 09:12 ID:???
>>249
orは||より優先度がずっと低いんだよ。
だから
@lines = <DB> or error;

(@lines = <DB>) or error;
と評価され、
@lines = <DB> || error;

@lines = (<DB> || error);
と評価される。
||演算子のオペランドはスカラコンテキストで評価されるから、
結果として一行しか読み込まれないことになる、というわけね。

>>252
< my(@lines = <DB>)
> (my(@lines) = <DB>)


254 : :02/08/06 15:22 ID:???
>>253
優先度を云々するのなら、= と || および = と or について言わないと意味ナイだろ。

255 : ◆JAPH9PWA :02/08/07 10:19 ID:???
>>254
そういえばそうだ。肝心な所が抜けててごめん。

>>253 追記
とりあえず、代入演算子は比較的優先順位が低くなってるんだよ。
例えば、算術演算子や比較演算子などは全て代入演算子より優先度が高い。
だからこそ
$foo = 100 + 200; という式が
($foo = 100) + 200; ではなく、$foo = (100 + 200);と評価される。
で、||や&&といった演算子は代入演算子よりも優先順位が高いため、
加算演算子と同様の評価順序になるってわけ。
しかしながら、orやandといった演算子の優先順位は代入演算子のそれより低いので、
このケースの場合は期待通りに動くわけだね。

詳細についてはついてはperldoc perlopを参照のこと。

256 : ◆JAPH9PWA :02/08/07 10:21 ID:???
ていうかここはファイルロックスレじゃないか!
スレ違いもいいとこだね。とほほ…

257 :228:02/08/10 00:33 ID:???
おかげであれからログが消えてません
open(LOG,"+<$log") || &error('ファイルエラー');
flock(LOG, 2) or &error('ロックエラー');
my @lines = <LOG> or &error('読み込みエラー');
〜〜〜更新処理〜〜〜
seek(LOG, 0, 0);
print LOG @lines;
truncate(LOG, tell(LOG));
close (LOG);
こんな感じです
やっぱり同時刻に書き込みが集中した時に消えるようなので
KENT式mkdirロックを少し改造したものをあわせて使ってます
そのまま使うとエラーでロックを外した瞬間に書き込みが重なってしまうようなので・・・
ありがとうございました

258 :230:02/08/10 06:54 ID:???
>>257
>そのまま使うとエラーでロックを外した瞬間に書き込みが重なってしまう

ロックを外したら、もはやそのプロセスは書き込まないはず。
まさか&errorでexitせずに、実行続けてるとか?

mkdir式が有効なのは、flockがダメだったからかもしれないが、
処理が遅くなるのとタイムアウトがある事で、読み書きが集中
しないようになった効果かもしれない。

質問者は問題が解決しさえすればいいんだが、
flockとmkdir式の併用なんて気持ちわるい結末だなぁ。

259 :228:02/08/10 18:58 ID:???
>ロックを外したら、もはやそのプロセスは書き込まないはず。
どんなエラーでもロックを外してしまうので
書き込み中の人がいて、それ以外の人がエラー出してロックを外してしまう
というのが問題でした
上で書いてるのはちょっと違いました。。

いろいろ教えて頂いたのに、はっきり原因を解明せずに
気持ち悪い結末にしてしまって申し訳ないですが
上のflockのみではprintで失敗したらどうしようもないのなら
mkdirを併用する方法はいいんじゃないかと思うんですが・・

260 :230:02/08/10 22:16 ID:???
>>259
書き込み中の人がいるとしたら、その人しかロックが成功していないので、
それ以外の人がロックを外す事はありえないのが排他制御。
mkdir式の場合、ロック成功したプロセスがエラーで外すなら問題ないわけ。
通常、ロックを成功してないプロセスがロックを外すようなのはバグ。
flockの場合はロックかけたプロセス以外は外せないよ。

> printで失敗したらどうしようもない
mkdirを併用しても同じ状況だけど。
print LOG @lines or &error('書き込みエラー');
でOK。truncateする前にやめればデータは壊れない。

とにかく、mkdir式にするならflockは必要ないので消そうよ。

261 :nobodyさん:02/08/11 12:39 ID:???
結局KENTかよ!!!

262 :nobodyさん:02/08/11 12:53 ID:???
flock使えるならflockにしとけよ!!!

263 :nobodyさん:02/08/11 13:45 ID:???
flockよりKENTが優れていることが証明されました!!!

264 :nobodyさん:02/08/11 13:46 ID:???
どこで?

265 :KENT:02/08/11 15:40 ID:???
flockってカエルだよね?

266 : :02/08/11 15:50 ID:???
おはロックが有効な鯖ってあるの?

267 :nobodyさん:02/08/11 19:41 ID:???
>>228
だから初めにflock効いてるのか調べてと言ってるのに
空振りしてるんだよ、それ
他のファイル編集部分は時間的にロック無しでも動いてるだけだよ多分

268 :nobodyさん:02/08/11 21:39 ID:???
「多分」って便利な言葉
俺は断言してないよ、忙しかったしよって感じ

269 :nobodyさん:02/08/14 01:12 ID:???
http://www.kent-web.com/support/wforum.cgi?mode=allread&no=3986&page=0

排他処理とはちょっとズレるかもしれないが、これは立派にシステム上に矛盾が起きてるんだから、"バグ"ではないにしろ、立派な不具合だよな…
この不具合って、そんなに難しいことなのかな…
あたりまえのように、こういうのは想定しないかな?
Kentのスクリプトって、こういうところが馬鹿だよね。


270 :nobodyさん:02/08/14 01:45 ID:7AoVgCGe
http://homepage1.nifty.com/glass/tom_neko/web/web_04.html#lockall
このまとめてロックっていいんですか?

271 :nobodyさん:02/08/14 02:02 ID:???
>>270
      ,一-、
     / ̄ l |   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ■■-っ < んな こたーない
    ´∀`/    \__________
   __/|Y/\.
 Ё|__ | /  |
     | У..  |

272 :nobodyさん:02/08/14 02:05 ID:7AoVgCGe
やっぱだめなんですか

273 :nobodyさん:02/08/14 02:14 ID:7AoVgCGe
他にいい方法はありませんか?


274 :nobodyさん:02/08/14 04:31 ID:???
ヅラを強力ロック

275 :nobodyさん:02/08/14 20:00 ID:DbQN4DsP
監獄ロック

276 :nobodyさん:02/09/14 03:01 ID:???
慎吾ママの

277 :nobodyさん:02/10/01 08:47 ID:OVvB7u9F
http://kagino110.hp.infoseek.co.jp/sub18.htm
強力なロックだ

278 :nobodyさん:02/10/01 14:48 ID:???
>>277
ううむ、強力すぎてアクセスさえもできないよ!

279 :名無しさん@お腹いっぱい。:02/10/01 16:34 ID:???
>>278
漏れは開きすぎちゃったよ。windows再起動した。
皆気をつけろよ。中のどれか開いたりしたら、国際電話だぞ。



280 :名無しさん@お腹いっぱい。:02/10/04 08:00 ID:???
ム板の「Perlについての質問箱」がruby基地外によって潰されました。
心ある人は、rubyスレにお礼参りしてください。


281 :nobodyさん:02/10/08 18:16 ID:???
>>277
ちょっとワラタ

282 :nobodyさん:02/10/11 23:24 ID:0pBUR/gh
read.cgiのファイルロック。これ最強

283 :nobodyさん:02/10/12 00:02 ID:???
>>282
どういうロックやってるの? 知らないから教えてくれ。

284 :nobodyさん:02/10/15 14:15 ID:???
ロックなんかしてないよ
2chの負荷でロックなんかしたら使い物にならん
壊れてたら読み直せばすむことだし

285 :nobodyさん:02/10/15 18:19 ID:jOp8uFKz
bbs.cgiはどうやってるの?

286 :nobodyさん:02/10/16 11:23 ID:???
日時とスレッドキーなんかを含めたファイル名で
一時ファイルを作って書き込み終わったら
subject.txtにリネーム
renameのアトミック性に頼ってるわけだな
datはふつうにflockしてるだけ

287 :nobodyさん:02/10/22 13:32 ID:???
わたし 思う。
ロック機能作る。
理論的 このスクリプト完璧。
でも どうテストする。
アルバイト100人雇う。
100人いっせいにアクセスする。
そんな 手間かけられない。 どうする。
2ちゃんねるに晒す。 それ怖い。 どうする。

288 : :02/10/22 16:25 ID:???

・ 実験しないで本番に使う。
・ 覚悟して晒す。
・ 一年生になって友達100人つくる。


289 :nobodyさん:02/10/22 16:39 ID:???
>>287
不覚藁

290 :nobodyさん:02/10/22 17:09 ID:???
>>287
100 スレッド立ててアクセスしまくるにきまっとろーが。

291 :nobodyさん:02/10/27 19:23 ID:zFNcoqUs
>>185
別人ですが、読み込んだものを加工してまた書き込む場合には
読み込むときにもロックが必要なんですね?
単に読み込んで、例えば表示したいだけで
加工もしない場合は必要ないんですよね。

292 :nobodyさん:02/10/27 21:19 ID:???
ログ更新中に読み出したらおかしな内容になってしまう。ロックは必要。

293 :nobodyさん:02/10/27 22:41 ID:???
テストスクリプトはlock握って数十秒眠るようにするわけだ。勿論タイムアウト値の調整は必要だ。
そうすりゃ一人でもテストできるだろ。

294 :nobodyさん:02/10/28 01:48 ID:???
>>292
表示がおかしかったら読み直してもらうという
アプローチもありうる(read.cgiとか)。

295 :nobodyさん:02/10/29 01:24 ID:3RRgraL5
flockについて、説明として例えば

flock(XX, 2)
書込中だから書込読込ロック、あとから来たら待つ。

とあるのですが、待つってどのくらい待つことが出来るのでしょう…?
上限や目安みたいなものはあるのでしょうか?

296 :nobodyさん:02/10/29 01:40 ID:???
>>295
めっちゃ、待つでぇ

297 : ◆hMJAPH9PWA :02/10/29 09:26 ID:???
>>295
実行者が我慢できなくなってkillするまで、ずっと待つよ。
で、それじゃこまるからってんでブロックしないモードがある。

use Fcntl qw(:flock);

flock FH, LOCK_EX | LOCK_NB or die "ロック失敗:$!";

298 :nobodyさん:02/10/29 09:56 ID:???
もっともブロックしないで無限ループするくらいなら
ブロックして待ったほうがましだが

299 :nobodyさん:02/11/03 16:56 ID:???
大事件発生!

rename を使った完璧なファイルロックが完成してしまいました。

300 :nobodyさん:02/11/03 18:41 ID:???
外出です

301 :nobodyさん:02/11/05 18:35 ID:5Ci8Aq1y
んむ・・・。

302 :perlお勉強ちゅー:02/11/29 01:12 ID:vd7dmowT
>>299
こんな感じかな、

my($process)=$$;
open (IN,"data.txt");
flock (IN,2);
open (OUT,">$process.tmp");
flock (OUT,2);

#hogehoge処理

close (IN);
close (OUT);
rename ("$process.tmp","data.txt");

不安なんですけど、これで良いのでしょうか?皆様。


303 :perlお勉強ちゅー:02/11/29 01:54 ID:???
↑ open の戻り値チェックしてなかった。スマソ

304 :私も勉強中:02/11/29 17:19 ID:???
close (OUT);
から
rename ("$process.tmp","data.txt");
までの間に、他のプロセスが open (OUT,">$process.tmp") を
実行してしまい、$process.tmpが空になる可能性がある。

※open (OUT,">$process.tmp")した瞬間
$process.tmpのファイルサイズが0になるので、
次の flock (OUT,2) で止めても手後れ。

そんな気がするが、どうだろうか。

305 :304:02/11/29 17:25 ID:???
ごめん、間違えた。
tmpファイルの名前を毎回変えれば大丈夫か。

306 :nobodyさん:02/11/29 19:16 ID:???
>>302
普通に、だめだね。
たとえば、Aプロセスがclose(OUT)まで行く、その直後にBプロセスが
open (IN,"data.txt");、でそのあとAプロセスがrename、Bプロセスは
普通に終了するけど、BのINは、Aが変更を加える前のdata.txtなので
Bがrenameした時点で、Aで加えた変更は破棄される。


307 :perlお勉強ちゅー:02/11/30 00:18 ID:???
>>304 さん >>306 さん
ご解説して下さってありがとうございます。
close しなければ rename できないと勝手に
思い込んでいました。(やってみたらできました)
close したときに flock が解除されるのなら
rename 後に close しとけば別プロセスに割り
込まれることが減り、少しはましになるかな。


308 :nobodyさん:02/11/30 15:54 ID:???
>>307
> rename 後に close
だめ。 AプロセスがINをopen、直後にBがINをopen、Aがflockして処理を
おえる、Bがflockを獲得して処理を終える。これでも、BのINはAが変更を
加える前のdata.txtなので、同様にAの変更が破棄される。

なおかつ、Win環境だとopen中のファイルのrenameはできなかったような?


309 :私も勉強中:02/11/30 16:23 ID:???
open (LOCK,"lock");
flock(LOCK,2);
open (IN,"data.txt");
open (OUT,"date.tmp");

#hogehoge処理

close (IN);
close (OUT);
rename ("date.tmp","data.txt");
close (LOCK);

INの前にflockするという方向で考えると、こうなるのか?
renameを使ったファイルロックと言っていいのかどうか分からないが。

310 :nobodyさん:02/12/01 00:55 ID:???
>>309
flock は、とりあえず >>1 の条件に反するので0点ってとこかな?

311 :perlお勉強ちゅー:02/12/01 14:43 ID:???
>>308
またもやありがとうございます。
rename 後の close を Windows2000 で試したところ、
ご指摘のとおりエラーになりました。

open してから flock するまでに間が空くのがいけないと思い、
今度はフラグを立てるタイプを考えてみましたが、
フラグが立ってるか判別するまでに間が空く・・・
私には解決が難しいので人のソースでもっと勉強してみます。

312 :cron:02/12/02 11:25 ID:YojCbNB7
ちょっと教えてほしいんだけど。。

Perlでロックしていてもcronでroot権限でrenameしてしまえるみたいなんだけど
Perlで複数のユーザーがどんどん書き加えていくファイルを何分か置きに
root権限で実行したい場合 問題の起こらない良い方法はありますか?

313 :nobodyさん:02/12/02 11:37 ID:???
>>312
rootで何をしたいのか?

314 :cron:02/12/02 13:01 ID:YojCbNB7
rootでしか実行できないコマンドを実行させるのに
そのコマンドのオプションはCGIで書き込ませたいのです。



315 :nobodyさん:02/12/02 14:26 ID:Vw2f1Ru9
>>314
ネタだよなぁぁぁぁ、頼むからネタだと言ってくれー

316 :cron:02/12/02 15:25 ID:YojCbNB7
なんで?おかしかった?ちゃんと教えてください

317 :☆☆☆☆☆:02/12/02 15:47 ID:Z6bI7Cqn
http://alink3.uic.to/user/ranran2.html

318 :nobodyさん:02/12/02 22:12 ID:???
オプティミスティック
オプティミスティック
オプティミスティック
ペシミスティック
ペシミスティック
ペシミスティック

あー、言いにくい

319 :nobodyさん:02/12/06 00:00 ID:???
>>316
あのさあ、rootって管理人のことだろ?
どこの鯖缶が赤の他人にroot権限使わせるってのよ。
やるんなら自鯖立ててやんなよ。

320 :Perlお勉強ちゅー:02/12/06 01:16 ID:???
アトミックというのと、入出力の処理全体を包み込むというのが
ファイルの排他処理のキーワードらしいとわかってきました。(つもり)
フラグにするものがアトミックというのは、例えれば、
一組のトランプからはクラブの 1 は 1 枚しか引けないからこそ
目印になるということかな。親元になければ誰もカードを取れないものね。

気になったのは、アトミックがいくつかの使われ方をしている事で、
1 : 現在の ファイル I/O では HDD への読み書きは物理的には一つしかできないことに依存してフラグを立てる。
  (HDD の複数ヘッドがばらばらに動いてたらこわいです。)
2 : Perl 上で処理全体をアトミックにと言う場合は、「読み」「処理」「書き」を
   「1」に依存して、他人(他プロセス)に口をはさませずに行う。
・・・って感じかな。
# 見当違いでしたらつつしんで怒られます。とほ。
# お勉強中途報告でスマソ。

321 :cron:02/12/08 07:08 ID:tHo7Ijtw
>>319
root権限で当然、自サバでするんだよ
cronのことしらないの?

322 :nobodyさん:02/12/08 08:24 ID:???
>>321
cronで動かすプログラムとWebプログラムでのファイルのロックが問題なの?
普通のファイルロックと同じようにやればいいじゃん。

323 :319:02/12/08 11:44 ID:???
>>321
自鯖でやるなんて一言も言わなかったじゃないか。
そもそも、自分が鯖缶だとも言ってない。

cronでCGI動かすようにすれば? んで、CGIの方でロックをきちんとすればいい。

324 :nobodyさん:02/12/08 11:44 ID:???
やればいいじゃん。

325 :nobodyさん:02/12/08 12:07 ID:???
>>323
cronでCGI動かすなんてアホな発想はどこから出てくるんだ?

326 :nobodyさん:02/12/08 12:11 ID:???
出てくるんだ?

327 :nobodyさん:02/12/08 16:05 ID:???
お前らいいかげんにネタだと気付け。
> Perlで複数のユーザーがどんどん書き加えていくファイルを何分か置きに
> root権限で実行したい場合 問題の起こらない良い方法はありますか?
「複数のユーザが書き換えるファイル」を「root権限で実行」する馬鹿が本当にいると思ってるのか?

328 :山崎渉:03/01/15 13:42 ID:???
(^^)

329 :nobodyさん:03/01/17 10:53 ID:t5G3aPWp
open(ABC "<$hoge") || &error("error");
とかよくやりますが
close(ABC);
閉じるときも
close(ABC) || &error("error");
とやるべきでしょうか?
closeに失敗することあるんでしょうか?

330 :nobodyさん:03/01/17 12:29 ID:+SxK8G04
>>329
非常にいい質問だね。
さ、誰か答えてやんなさい。

331 :nobodyさん:03/01/17 13:58 ID:???
while (!close(ABC)) {}

332 :nobodyさん:03/01/18 00:49 ID:???
perl -e 'close(STDIN); close(STDIN) || die $!'
それがどうファイルロックと関係あるのかと

333 :nobodyさん:03/01/18 14:04 ID:???
ファイルロックしている最中にcloseに失敗してエラー処理をせずに
処理が終了されて、ロック解除できずロックファイルが残る場合。

334 :nobodyさん:03/01/18 17:36 ID:???
Apacheのアクセスログなんか尋常じゃないほどの書き込みがあるが
どうして上手くいっているのだろうか?

335 :nobodyさん:03/01/18 18:30 ID:???
>>334
O_APPEND

336 :nobodyさん:03/01/18 20:35 ID:???
>>333
エラー処理の中にバグを入れるのは本末転倒だろうが。

337 :nobodyさん:03/01/18 20:51 ID:???
>>335
ファイルの追加書き込みって上手く使うとflockないシステムでも上手くロックをかけれるかも

338 :nobodyさん:03/01/19 23:58 ID:???
>>337
ロックじゃねーよ。

98 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)