【Perl】ファイルロック(排他処理)について語ろうat PHP
【Perl】ファイルロック(排他処理)について語ろう - 暇つぶし2ch63:fusianasan
02/06/26 19:33
>60
全然わかってないねー。まだ気づかないの?



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

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

65:「このサイトの人」
02/06/26 19:57 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
>65
リネームに成功したかどうか、結果を確認できていない。
もしAというプロセスが10分以上前と判断した状態でプロセスを次に渡して、
Bというプロセスがリネームまで成功してCというプロセスが$lockdir2を作って
しまったら、Aというプロセスもリネームできてしまいロックできないのでは?


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

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


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

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


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

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


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




71:「このサイトの人」
02/06/26 23:51 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
                 /\
                / ヽ\
               /  ヽ \             / \
              /    ヽ \__        / ヽ \
             /  ‐_ ヽ     ――__/   ヽ \
            /        ̄           / __ ヽ \
           |                          ̄  \
           |                             |
           |        ||                   |
           |  ゝ_  |||/                  |
           |  ( ・ ブ       ゝ__       ┃ ┃   |
           |    ̄         ( ・ ̄ ̄ ブ   ┛ ┗  |
           |              ゝ__ ノ    ━┓ ┏  |   ┃ ┃
           |    __            ̄        ┃  |   ┃  ┃
           |     | ̄ ̄ーヽ                  |   ┃   ┃
           |     |     ヽ                 |
           |     |     |ヽ               |      ━┓
            \   _⊥_    |                |      ┃┛
             \      ̄ ̄ヽ_⊥               |      ┏━┓
              \                         |       ┏┛
               \                       /        ・




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


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

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


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




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

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



78:「このサイトの人」
02/06/28 01:42 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
>>78
興味深い話題をありがとー

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




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

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


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

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

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

86:nobodyさん
02/06/30 00:13 naYSzTIE
リムネットは使えませんね。
URLリンク(www.rim.or.jp)

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

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

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

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

1 symlink
2 mkdir
3 flock
4 rename

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


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

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

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

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










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











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

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


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

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


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

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

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

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



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

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


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

どういう意味?


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

103:japh ◆J.5V8ta6
02/06/30 21:29
>>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
>>103

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


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

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

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

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

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

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

112:nobodyさん
02/07/01 22:52
面白いの見っけ。
URLリンク(tako.2ch.net)

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

114:nobodyさん
02/07/02 17:44
こっちで
URLリンク(natto.2ch.net)

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

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

116:Hideki ◆wtRzKEV2
02/07/09 09:11
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
age

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

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

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

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

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

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

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

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





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






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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

139:nobodyさん
02/07/10 00:53
駄目駄目な実例。突っ込みどころ満載です。
URLリンク(www2q.biglobe.ne.jp)

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

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

スレリンク(sec板:349-番)

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

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

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

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

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

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

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

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

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


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

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

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

URLリンク(www.sleepycat.com)
URLリンク(www.sleepycat.com)
見て出直してこい。ちなみにこの document は 4.0.14 のだけど、
3.x のころからしっかり lock subsystem がある。

153:nobodyさん
02/07/10 21:53
>>152
OS標準で入ってるつーと
URLリンク(www.freebsd.org)
とかVer 1だろ。
perlのDB_Fileで2や3も使えるけど、インターフェースは1でサポートされてる部分しか使えねーはずだが。

154:nobodyさん
02/07/11 02:02
>>153
URLリンク(search.cpan.org)
使えば?

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

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

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

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

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

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

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

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

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

# 排他処理をしたいです。
# ローカル環境(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
>>161
ディレクトリに書き込み権限がない。
既にロックされている(./lockfileが存在する)。
のどちらか。

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

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

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

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

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

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

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

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
>>165
いいんじゃないの?それでも別に。

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

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

169:nobodyさん
02/07/18 14:56
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
どうもならないよ、定数吐き出すだけでしょ?
正確にはsyswriteするか$|=1してバッファ使わない様にした方が良いけど

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


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

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

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

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

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


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


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

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

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

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

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

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

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


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

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

185:行番号でるかな
02/07/19 03:00
>>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
なるほど、了解しました。
どこかのサイトに読み込みオープンでもflockすべきだと
書いてあったのが気になっていたんですが、
そういう場合のことだったんですね。
ありがとうございました。

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

188:nobodyさん
02/07/19 15:23 H65klWUw
URLリンク(www.din.or.jp)

これじゃだめか?

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

if($lockkey) {
  &unlock;
}

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

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

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

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

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

208:nobodyさん
02/07/29 15:15
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
>>207
別にわるかねぇよ。

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

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

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

ロックファイル作成

ファイル読み込み

ロックファイル消す

カウントUP

ロックファイル作成

ファイルに書き出し

ロックファイル消す

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


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

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

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


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

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

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

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


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

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

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

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

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

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

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


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

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

229:nobodyさん
02/08/01 02:00 DTOpJumx
>>228に便乗
①open直後
②print直後
③close
②、②~③でしょうか?
でもopenでクリティカルな場合に吹っ飛ぶこと考えると…①?

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

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

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

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

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

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

234:nobodyさん
02/08/03 18:57
URLリンク(www.google.co.jp)
>>1-233
この調子でがんばれ糞ども

235:228
02/08/03 20:27 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
>>235
でかいファイルを全部配列に入れるのは大問題だ

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

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

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

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

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

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

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

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

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

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

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

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

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 eY1Nkha6
my @lines=<DB> || &error('読み込みエラー');
にしたら
最初の一行しか読まないんですが・・
すいません・・・

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

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

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

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


眠たい

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

253: ◆JAPH9PWA
02/08/06 09:12
>>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
>>253
優先度を云々するのなら、= と || および = と or について言わないと意味ナイだろ。

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

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

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

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

257:228
02/08/10 00:33
おかげであれからログが消えてません
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
>>257
>そのまま使うとエラーでロックを外した瞬間に書き込みが重なってしまう

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

269:nobodyさん
02/08/14 01:12
URLリンク(www.kent-web.com)

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


270:nobodyさん
02/08/14 01:45 7AoVgCGe
URLリンク(homepage1.nifty.com)
このまとめてロックっていいんですか?

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

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

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


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

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

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

277:nobodyさん
02/10/01 08:47 OVvB7u9F
URLリンク(kagino110.hp.infoseek.co.jp)
強力なロックだ

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

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



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


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

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

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

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

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

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

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

288:
02/10/22 16:25

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


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

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

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

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

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

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

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

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

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

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

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

use Fcntl qw(:flock);

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

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

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

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

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

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

302:perlお勉強ちゅー
02/11/29 01:12 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
↑ open の戻り値チェックしてなかった。スマソ

304:私も勉強中
02/11/29 17:19
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
ごめん、間違えた。
tmpファイルの名前を毎回変えれば大丈夫か。

306:nobodyさん
02/11/29 19:16
>>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
>>304 さん >>306 さん
ご解説して下さってありがとうございます。
close しなければ rename できないと勝手に
思い込んでいました。(やってみたらできました)
close したときに flock が解除されるのなら
rename 後に close しとけば別プロセスに割り
込まれることが減り、少しはましになるかな。


308:nobodyさん
02/11/30 15:54
>>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
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
>>309
flock は、とりあえず >>1 の条件に反するので0点ってとこかな?

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

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

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

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

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

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



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

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

317:☆☆☆☆☆
02/12/02 15:47 Z6bI7Cqn
URLリンク(alink3.uic.to)

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

あー、言いにくい

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

339:世直し一揆
03/01/30 10:23 EZ4VgkoJ
<血液型A型の一般的な特徴>(見せかけの優しさ・もっともらしさ(偽善)に騙され
るな!)
●とにかく気が小さい(神経質、臆病、二言目には「世間」、了見が狭い)
●他人に異常に干渉し、しかも好戦的・ファイト満々(キモイ、自己中心)
●自尊心が異常に強く、自分が馬鹿にされると怒るくせに平気で他人を馬鹿にしようと
する(ただし、相手を表面的・形式的にしか判断できず(早合点・誤解の名人)、実際に
はたいてい、内面的・実質的に負けている)
●本音は、ものすごく幼稚で倫理意識が異常に低い(人にばれさえしなければOK)
●「常識、常識」と口うるさいが、実はA型の常識はピントがズレまくっている(日本
の常識は世界の非常識)
●権力、強者(警察、暴走族…etc)に弱く、弱者には威張り散らす(強い者に弱く
、弱い者には強い)
●あら探しだけは名人級(例え10の長所があってもほめることをせず、たった1つの短所を見つけてはけなす)
●基本的に悲観主義でマイナス思考に支配されているため性格がうっとうしい(根暗)
●一人では何もできない(群れでしか行動できないヘタレ)
●少数派の異質、異文化を排斥する(差別主義者、狭量)
●集団によるいじめのパイオニア&天才(陰湿&陰険)
●悪口、陰口が大好き(A型が3人寄れば他人の悪口、裏表が激しい)
●他人からどう見られているか、人の目を異常に気にする(「世間体命」、「~みたい
」とよく言う)
●自分の感情をうまく表現できず、コミュニケーション能力に乏しい(同じことを何度
も言ってキモイ)
●表面上意気投合しているようでも、腹は各自バラバラで融通が利かず、頑固(本当は
個性・アク強い)
●人を信じられず、疑い深い(自分自身裏表が激しいため、他人に対してもそう思う)
●自ら好んでストイックな生活をし、ストレスを溜めておきながら、他人に猛烈に嫉妬
する(不合理な馬鹿)
●執念深く、粘着でしつこい(「一生恨みます」タイプ)
●自分に甘く他人に厳しい(自分のことは棚に上げてまず他人を責める。しかも冷酷)
●男は、女々しいあるいは女の腐ったみたいな考えのやつが多い(例:「俺のほうが男
前やのに、なんでや!(あの野郎の足を引っ張ってやる!!)」)

340:nobodyさん
03/01/30 12:26 RKDiglA0
最近運用してるページでロックがよく残る、書き込みファイルがロックしてるにもかかわらず
壊れるという現象が頻発して困ります。
なにか他のいい方法を探しているのですが
書き込み待ちテンプを作るやり方があると聞いたのですが
教えてください。


341:nobodyさん
03/01/30 13:08
>>340
マジレス
お前のロックの仕方が変なだけ

342:nobodyさん
03/01/31 04:05 QdG4FrQH
画像貼り付け掲示板なのですが
どのようにロックかけるのがのぞましいのでしょうか?

343:nobodyさん
03/01/31 07:27 K4VaGHSu
いいサイトだ♪URLリンク(homepage3.nifty.com)

344:nobodyさん
03/01/31 20:55
安全なようにロックをかけるのが望ましい

345:nobodyさん
03/02/01 03:10 6WMjWs0+

                 ∧∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
                (,,゚Д゚)< みんなで視姦汁!
              ./  |   \________
      .______(___/_____
       .|03. 2. 2. / AHE |
       .|________________|
      /\               \
    /    \ 2003年2月2日 \
  / Λ_Λ \   .13:00…   \
/__( ´д`)_\______________\
|       |ゲ.|    │               |
|       |.ロ |    │  梅田丸ビルの  .|
|       |ゲ.|    │  電光掲示板に… .|
|       |.ロ |    │  ..『(゚д゚)ウマー』   |
|γ__  |ゲ.|    │ ̄\       / ̄|
|    \ |.ロ |    │    \_________/    |
|       |ゲ.|    │               │
|____|__||_|)|.ロ |    │ コ ッ プ 1 杯 .│
|□━□ )     │ . ( 約 200ml ) で  |
|  J  |) / ̄ ̄  |. 1 日 分 の * .|
| ∀ ノ < ヒヒヒヒヒ  | 黄色ブドウ状球菌  |
|  - ′ . \____ |   2 分  の 1  |
|  )          │               │
|/.  製 造    ..|               │
| . 逝印大阪工場 . |       500 ml     |
|____________________|______________|

スレリンク(offreg板)l50

346:nobodyさん
03/02/01 03:23
なんだ、騙されたスレじゃないのか

347:nobodyさん
03/02/19 23:23
よくチャックがあけっばなしと言われます

348:山崎渉
03/03/13 17:22
(^^)

349:nobodyさん
03/03/13 22:46
>>329
ログの閉じミスなんて気にしなくても。。。

350:nobodyさん
03/03/22 18:02
どうせさほどアクセスが多いところじゃないんだろうから、mkdirと強制ロック解除のパターンでいいじゃん。

351:nobodyさん
03/04/17 00:56 s+I4ylgd
Perlメモの
URLリンク(www.din.or.jp)
を使おうと思ったんですが、

なにげにperl初心者なんで、その使い方がわかりません。
perlメモには、
$lfh = my_flock() or die 'Busy!';

# アンロックする
my_funlock($lfh);

$lfh にはなにをいれれればいいのでしょう?ファイル名?ファイルハンドル?



352:nobodyさん
03/04/17 02:26
なにも

353:山崎渉
03/04/17 11:58
(^^)

354:351
03/04/17 22:16 PczzXVDV
>>352
どういうこと?

355:佐々木健介
03/04/17 22:16
     ______
    /_      |
    /. \ ̄ ̄ ̄ ̄|
  /  /  ― ― |
  |  /    -  - |
  ||| (5      > |
 | | |     ┏━┓|   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | |     ┃─┃|  < こんなサイトを見つけた
|| | | |  \ ┃  ┃/    \  正直、スマンカッタ
| || | |    ̄         \_________
URLリンク(freeweb2.kakiko.com)

356:nobodyさん
03/04/17 22:26
>>354
なにげにが気に入らないから教えない

357:bloom
03/04/17 22:56 ahUYqmP+
URLリンク(www2.leverage.jp)

358:nobodyさん
03/04/17 22:57
なんでDB使わないの?

359:あぼーん
03/04/17 23:23
 ( ・∀・)/< こんなのみつけたっち♪ 
URLリンク(www.japan.pinkserver.com)
URLリンク(www.japan.pinkserver.com)
URLリンク(www.japan.pinkserver.com)
URLリンク(www.japan.pinkserver.com)
URLリンク(www.japan.pinkserver.com)
URLリンク(www.japan.pinkserver.com)
URLリンク(www.japan.pinkserver.com)
URLリンク(www.japan.pinkserver.com)
URLリンク(www.japan.pinkserver.com)
URLリンク(www.japan.pinkserver.com)

360:nobodyさん
03/04/18 23:20
>>358
一回使ったらまた集めなきゃならないだろ。

361:nobodyさん
03/04/19 13:00 EJZQKwDz
URLリンク(homepage1.nifty.com)
に載ってる「ファイルを上書きする場合」(↓)
open(OUT, "+< $datafile"); # 読み書きモードで開く
flock(OUT, 2);         # ロック確認。ロック
seek(OUT, 0, 0);       # ファイルポインタを先頭にセット
print OUT "$data\n";    # 書き込む
truncate(OUT, tell(OUT)); # ファイルサイズを書き込んだサイズにする
close(OUT);          # closeすれば自動でロック解除

を参考にして、
「(1)ファイルの中身(データ)を読み込んで、読み込んだデータを加工して、
(3)再度同じファイルにデータを格納する場合」を考えたんだけど、
↓で特に問題ないでしょうか?

$datafile = "data.txt";
open(OUT, "+< $datafile");       # 読み書きモードで開く
flock(OUT, 2);               # ロック確認。ロック
@Array_data = <OUT>;          # ★追加:(1)ファイルの中身を読み込んで
foreach $values (@Array_data){
  #@Array_dataをいろいろ加工;    # ★追加:(2)読み込んだデータを加工
  chomp $values;
  $values = $values * 2;
  push (@New_Array_data,"$values\n");
}
seek(OUT, 0, 0);             # ファイルポインタを先頭にセット
print OUT @New_Array_data;     # ●変更:(3)再度同じファイルにデータを格納
truncate(OUT, tell(OUT));       # ファイルサイズを書き込んだサイズにする
close(OUT);                # closeすれば自動でロック解除




362:nobodyさん
03/04/19 15:13
>>361
うん、これで問題ないね

363:nobodyさん
03/04/19 19:05
> ★追加:(2)読み込んだデータを加工
この最中に逝っちゃっても大丈夫?

364:nobodyさん
03/04/19 19:45
>>363
途中でプロセスが死んだらどんなことしたって壊れるときは壊れる

365:山崎渉
03/04/20 06:00
   ∧_∧
  (  ^^ )< ぬるぽ(^^)

366::
03/04/21 18:06 J93Hac+3
☆^~^★ 50音順で探せて楽して得する
URLリンク(sagatoku.fc2web.com)
   あなたの探し物きっとみつかるよ☆^~^★


367:nobodyさん
03/04/21 21:46
>>364
駄目じゃん

368:nobodyさん
03/04/21 22:35
>>367
たかが趣味でやってるCGIのデータなんだから気にしすぎ
壊れたらどうやって対処するかスキルを身に付けるいいチャンス

369:nobodyさん
03/04/21 23:09
>>368
そういう誤魔化し方は好きじゃないな

370:nobodyさん
03/04/21 23:33
書いてる途中で死んでもジャーナルファイルシステムの恩恵にあずかれたりしない?

371:nobodyさん
03/04/21 23:54
どんなことしても、壊れる物は壊れる。
イヤなら定期的にバックアップ取る処理を組め。


372:nobodyさん
03/04/22 14:19
突然死するトランザクションは救えないが、DBが壊れないようにすることは可能。

373:nobodyさん
03/04/22 20:26
これだけ粘着的にこだわって、実は IDE で RAID も組んでません、とかいうオチはないよな?

374:nobodyさん
03/04/22 20:41
妥協しないぐらい食材にこだわって、実は化学調味料ドバドバ入れちゃうみたいな?

375:っていうか
03/04/24 13:03
別ファイルに書き込んで mv
これ定説

376:山崎渉
03/05/22 02:08
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―

377:nobodyさん
03/05/22 07:17
厨房な質問で悪いんですが、mkdirを使ったファイルロックってこういうことですか?

if (opendir(LOCK, "lock")) {
  closedir(LOCK);

  rmdir("lock");

  # 処理

  mkdir("lock");
}

378:nobodyさん
03/05/22 09:34 sAd9/kNT
mkdir("lock")
じゃなくて
mkdir("lock", 600)
でした。

379:nobodyさん
03/05/22 10:08
>>378
違う。
if (mkdir ("lock", 755)) {
  (処理)
}

こう。
mkdirは、ディレクトリの作成に成功すると真が、
失敗すると偽が返ってくる。


380:nobodyさん
03/05/22 13:35 2b2Zl4vP
>>379
?それだけでいいんでふか?

381:nobodyさん
03/05/22 13:46
20代OLです毎日上司のセクハラや通勤電車での痴漢でストレスがたまっていた
そのときにネットで見つけたアダルトDVDショップ以前からオナニー用にDVD
が欲しかったのですぐ注文しました、とても安くてびっくりしましたが次の日には
もう届きました私が買ったのは、オナニー、レズ、レイプです毎日オナニーしてま
す。
URLリンク(www.net-de-dvd.com)


382:nobodyさん
03/05/22 13:53
>>380
URLリンク(homepage1.nifty.com)
このへんでも参考に

383:380 じゃないけど
03/05/22 15:06
>>382
激しく参考になりますた。謝謝。

ところで
flock() が使えないところで

eval{ if(!(flock(FH, 2))){ &function; } };

とした場合ちゃんとサブルチンに逝ってくれますか?
false は返ってくるんでしょうか?


384:nobodyさん
03/05/22 15:40 Mzhw6+0o
>>382
サンクスコ(・∀・)

385:nobodyさん
03/05/23 13:24 ORCLTuvq
ロックする時にmkdirでディレクトリを作って、
アンロックする時にrmdirでディレクトリ削除ってことですよね?

>>382のサイト見てないけど…。

386:nobodyさん
03/05/23 13:28
>>385
見ろ。

387:山崎渉
03/05/28 17:07
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎―◎                      山崎渉

388:nobodyさん
03/05/28 18:03
age

389:nobodyさん
03/05/31 21:04 n0OtuFEQ
ロックされてるかどうか調べるにはどうしたらいい?
他のプロセスでロックしてるファイルにアクセスしてもロックがすぐ終っちゃうような…。

どうすれバインダー。

390:動画直リン
03/05/31 21:10 1EAhrEiJ
URLリンク(homepage.mac.com)

391:nobodyさん
03/05/31 21:44
>>389
激しくロックの方法に依ると思うんだが。

392:389
03/05/31 21:45 n0OtuFEQ
全般的にできるのはないの?

393:nobodyさん
03/05/31 22:08 nC5SP5sD
>>392
ロック中に
sleep 60;


394:nobodyさん
03/05/31 23:30
弱いかな?
package FileLock;
use IO::File;
my $CAT= '/bin/cat';
sub open_w {
my $filename= shift;
mkdir($filename)unless -d $filename;
my $base= sprintf("%s.%s.",time,$$);
my $cnt= 0;
$cnt++ while(-f "$filename/$base$cnt");
return IO::File->new("$filename/$base$cnt",'>>');
}
sub open_r {
my $filename= shift;
return IO::File->new("|$CAT $filename/*");
}
1;


395:nobodyさん
03/06/01 04:57 Hll/ZLYf
>>393
おぉ!蟻がとう。

396:nobodyさん
03/06/01 12:29
>>393
禿げ藁

397:nobodyさん
03/06/01 13:22
>>394
駄目ロック。これ使うならロックしなくていい。

398:nobodyさん
03/06/01 21:54
アンケートみたいに読み出しが少なくて、書き込みが多いときに
flockと組み合わせて(かつcron回してファイルをまとめつつ)
使ってたんだけど。。。駄目かぁ(´Д`;)


399:nobodyさん
03/06/02 00:36
>>398
> mkdir($filename)unless -d $filename;
意味なし。複数のプロセスでunless -d $filenameが成立する可能性がある。
排他制御するにはアトミックにやらないと駄目。

排他制御に強い/弱いは無い。正しいか駄目のどちらか一方、わずかでも可能性があれば駄目ロック。

400:nobodyさん
03/06/02 09:59 7y9vki3n
そういえばみんななんで、
--$retry <= 0
なんてやってるの?
$retry--
じゃまずいの?

401:nobodyさん
03/06/02 10:09 Ixodm31c
みてね♪
URLリンク(www1.free-city.net)

402:nobodyさん
03/06/02 10:20 sw1UrgM5
               ∧_∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
              ( ´∀`)/< 先生もろDVDはどこですか?
           _ / /   /   \___________
          \⊂ノ ̄ ̄ ̄ ̄\
           ||\        \
           ||\|| ̄ ̄ ̄ ̄ ̄||                
           ||  || ̄ ̄ ̄ ̄ ̄||         ∧_∧    / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  
              .||          ||         (´Д` )  <  URLリンク(www.dvd01.hamstar.jp) だ!
                              /   \   \___________
                              ||  ||  
                              ||  ||
                         __ //_ //___
                        /  //  //      /
                       /    ̄     ̄      //
                       || ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||  ||
                       || ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||  ||
                       ||    教卓         ||  ||
                       ||                ||




403:nobodyさん
03/06/02 10:29
>>400
デクリメントの事言ってるのか?
前置きと、後置きでは、動作が違う。
そして、スレ違い。


404:nobodyさん
03/06/02 10:35 azLkJHuz
>>403
いやいや、なんで<=を使ってるかが知りたいの?
ifって偽だと実行しないでしょ?
$retryは最終的に0になるわけだから、<=は必要ないだろ。

ってかスレ違いって分かってるので、逝ってきます。

405:nobodyさん
03/06/02 10:39 7y9vki3n
良く見たら答えが分かった。馬鹿か俺。

やっぱり逝くしかないな…。

406:直リン
03/06/02 11:10 mGHfwiJV
URLリンク(homepage.mac.com)

407:nobodyさん
03/06/02 11:20
>>404-405
0は偽だが、-1は真になる。

上げてる時点で逝ってください( ̄人 ̄)


408:nobodyさん
03/06/02 11:42
>>407
でも絶対-1にはならなくない?

まだ逝ってないよ、俺。

409:nobodyさん
03/06/02 12:07
>>408
いや・・・だからさ・・・
全体のソース読んでないんで分からないんだけど。
マイナスになる可能性があるかもしれないんでしょ?

--$retry <= 0

この条件だと、$retryがもし0だったら・・・
-1 <= 0
こんな判定になるし。
0が入る訳がないソースだったとしても、
ちゃんと条件書いてる方が、見た目分かりやすいってのもある。
そして、スレ違いだから、やっぱ逝くべき。


410:nobodyさん
03/06/02 12:14
>>404
> いやいや、なんで<=を使ってるかが知りたいの?
・・・え? 問い掛けられても・・・


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

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

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

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

413:nobodyさん
03/06/02 13:02
>>412
だから・・・・

--$retry <= 0

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

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


414:動画直リン
03/06/02 13:10 mGHfwiJV
URLリンク(homepage.mac.com)

415:nobodyさん
03/06/02 13:14
>>413
そういうことね。
上の方のソースやKENTのソース。

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

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

417:_
03/06/02 14:38
URLリンク(homepage.mac.com)

418:_
03/06/02 16:09
URLリンク(homepage.mac.com)

419:_
03/06/02 19:13
URLリンク(homepage.mac.com)

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

421:nobodyさん
03/06/17 05:57
URLリンク(search.cpan.org)
これって使っても平気ですか?


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

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

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

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

425:nobodyさん
03/07/08 12:02
情報処理

426:nobodyさん
03/07/08 12:12
>>424
歯科医師

427:nobodyさん
03/07/08 12:19
国家公務員一級


428:nobodyさん
03/07/08 15:54
シスアドだべ。

429:nobodyさん
03/07/08 15:58
公害防止管理者だろ

430:nobodyさん
03/07/09 00:33
>>426
司会者?

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




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

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

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


435:nobodyさん
03/07/11 11:17
そりゃステレオタイプだ

436:nobodyさん
03/07/14 17:20
>>424
おまいいい加減教えろ!

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

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

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

438:nobodyさん
03/07/15 06:44
いかぁん、名前が残ってた!!!

氏のう。。。。

439:山崎 渉
03/07/15 11:08

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

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

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

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


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

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



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch