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

52 名前:nobodyさん mailto:sage [02/06/25 17:04 ID:???]
alerm使うよりLOCK_NB使えよ。

53 名前:nobodyさん mailto:sage [02/06/25 18:20 ID:???]
alerm使うよりalarm使えよ

54 名前:nobodyさん mailto:sage [02/06/25 18:21 ID:???]
(゚Д゚)ハァ?

55 名前:nobodyさん mailto:sage [02/06/25 21:07 ID:???]
(OДO)ハァ!

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


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

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

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

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

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

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



61 名前:nobodyさん mailto:sage [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さん mailto:sage [02/06/26 19:08 ID:???]
>>60
flockがロックを解放しないというのは?

63 名前:fusianasan mailto:age [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 mailto:age [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 mailto:age [02/06/26 22:39 ID:???]
>67
わかった?

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


69 名前:fusianasan mailto:age [02/06/26 22:47 ID:???]
補足:

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


70 名前:nobodyさん mailto:sage [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さん mailto:sage [02/06/27 12:25 ID:???]
                 /\
                / ヽ\
               /  ヽ \             / \
              /    ヽ \__        / ヽ \
             /  ‐_ ヽ     ―――__/   ヽ \
            /        ̄           / __ ヽ \
           |                          ̄  \
           |                             |
           |        ||                   |
           |  ゝ_  |||/                  |
           |  ( ・ ブ       ゝ__       ┃ ┃   |
           |    ̄         ( ・ ̄ ̄ ブ   ┛ ┗  |
           |              ゝ__ ノ    ━┓ ┏  |   ┃ ┃
           |    __            ̄        ┃  |   ┃  ┃
           |     | ̄ ̄ーヽ                  |   ┃   ┃
           |     |     ヽ                 |
           |     |     |ヽ               |      ━┓
            \   _⊥_    |                |      ┃┛
             \      ̄ ̄ヽ_⊥               |      ┏━┓
              \                         |       ┏┛
               \                       /        ・




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


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

75 名前:nobodyさん mailto:sage [02/06/27 17:02 ID:???]
透明あぼーん面倒


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




77 名前:nobodyさん mailto:sage [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さん mailto:sage [02/06/28 09:45 ID:???]
>>78
興味深い話題をありがとー

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






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

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


83 名前:&r mailto:sage [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]
リムネットは使えませんね。
www.rim.or.jp/support/guide/homepage/cgi/index2.html

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

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

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

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

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

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

95 名前:nobodyさん mailto:sage [02/06/30 16:49 ID:???]










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











96 名前:nobodyさん mailto:age [02/06/30 18:12 ID:???]

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


97 名前:nobodyさん mailto:age [02/06/30 18:33 ID:???]

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


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

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

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

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



100 名前:nobodyさん mailto:age [02/06/30 20:48 ID:???]
>>98

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




101 名前:nobodyさん mailto:age [02/06/30 20:58 ID:???]
>>99

どういう意味?


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

103 名前:japh ◆J.5V8ta6 mailto:sage [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さん mailto:age [02/06/30 21:37 ID:???]
>>103

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


105 名前:nobodyさん mailto:sage [02/06/30 22:36 ID:???]
>>104
たぶんダメ

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

107 名前:nobodyさん mailto:sage [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さん mailto:sage [02/07/01 01:41 ID:???]
>107
それでロックしてるの? もっと基本から確認してみては?

109 名前:nobodyさん mailto:sage [02/07/01 02:01 ID:???]
>>107
ヴァカハケーン!!

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



111 名前:nobodyさん mailto:sage [02/07/01 02:27 ID:???]
>110
おまえも気づけYO!

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

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

114 名前:nobodyさん mailto:sage [02/07/02 17:44 ID:???]
こっちで
natto.2ch.net/perl/kako/963/963036704.html

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

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

116 名前:Hideki ◆wtRzKEV2 mailto:sage [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 mailto:age [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さん mailto:age [02/07/09 16:05 ID:???]
>>116
はなしにならん。きみには失望させられたよ。

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



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

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

125 名前:nobodyさん mailto:sage [02/07/09 22:36 ID:???]





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






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


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

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

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

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

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

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



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

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

133 名前:Hideki ◆wtRzKEV2 mailto:hideki@massassi.net [02/07/10 00:35 ID:???]
> まだまだだよな
そうです。まだまだこれからです。まだ若いので。

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

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

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

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

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

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

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



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

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

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

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

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

145 名前:nobodyさん mailto:sage [02/07/10 03:22 ID:???]
>>142
DBは禁句だろ。

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

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

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

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

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


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



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

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

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






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

前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