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

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 がある。

153 名前:nobodyさん mailto:sage [02/07/10 21:53 ID:???]
>>152
OS標準で入ってるつーと
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さん mailto:sage [02/07/11 02:02 ID:???]
>>153
search.cpan.org/search?dist=BerkeleyDB
使えば?

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

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

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



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

157 名前:nobodyさん mailto:sage [02/07/11 09:23 ID:???]
また釣れた(・∀・)クスクス

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

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

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

161 名前:nobodyさん mailto:age [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さん mailto:sage [02/07/12 19:10 ID:???]
>>161
ディレクトリに書き込み権限がない。
既にロックされている(./lockfileが存在する)。
のどちらか。

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

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

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

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

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

164 名前:161 mailto:sage [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さん mailto:sage [02/07/18 05:55 ID:???]
>>165
いいんじゃないの?それでも別に。

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

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

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

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


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

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

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

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



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


177 名前:nobodyさん mailto:sage [02/07/18 17:42 ID:???]
みんなあまのじゃくさん♪


178 名前:nobodyさん mailto:sage [02/07/18 19:10 ID:???]
すんげー荒れてるw

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

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

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

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

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

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


184 名前:nobodyさん mailto:sage [02/07/19 02:45 ID:???]
>>165

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

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

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

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

これじゃだめか?

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

190 名前:nobodyさん mailto:sage [02/07/19 15:48 ID:???]
>>189
???????????????????????????????????????????????????

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

192 名前:nobodyさん mailto:??? [02/07/20 21:32 ID:???]
2chはflockか?

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

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

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



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

197 名前:nobodyさん mailto:age [02/07/26 03:55 ID:???]
&unlock if($lockkey);

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


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

199 名前: mailto:sage [02/07/26 09:01 ID:???]
>>197はマルチポスト

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

201 名前:nobodyさん mailto:age [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さん mailto:sage [02/07/26 13:45 ID:???]
>>197 && >>202
ファイルロックとは関係ないぞ。
Perl初心者スレへ。

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

205 名前:nobodyさん mailto:age [02/07/29 14:41 ID:???]
あげてわるいか!



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

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

208 名前:nobodyさん mailto:  [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さん mailto:sage [02/07/29 15:21 ID:???]
>>207
別にわるかねぇよ。

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

211 名前:nobodyさん mailto:sage [02/07/29 15:36 ID:???]
>>210
どういう意味なんだ?

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

ロックファイル作成

ファイル読み込み

ロックファイル消す

カウントUP

ロックファイル作成

ファイルに書き出し

ロックファイル消す

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


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

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

215 名前:nobodyさん mailto:sage [02/07/29 16:32 ID:???]
219に期待sage




216 名前:nobodyさん mailto:sage [02/07/29 17:26 ID:???]
>>219 はロッカー♪

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

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

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


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

221 名前:nobodyさん mailto:sage [02/07/29 22:13 ID:???]
Windowsでうごかねぇよ。

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

223 名前:nobodyさん mailto:sage [02/07/29 22:17 ID:???]
>>222
最強だな、うん

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

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



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


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

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

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

231 名前:229 mailto:sage [02/08/01 13:35 ID:???]
>>230
thnx
参考になりますた

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

233 名前:nobodyさん mailto:sage [02/08/02 01:01 ID:???]
>>232
アマちゃんですね。

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

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

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

242 名前:239 mailto:sage [02/08/04 14:38 ID:???]
>>241 正直、スマンカッタ。

243 名前:nobodyさん mailto:sage [02/08/04 15:21 ID:???]
で、なにが最強なの?

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

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

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

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



246 名前:230 mailto:sage [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さん mailto:sage [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さん mailto:sage [02/08/06 06:51 ID:???]
>>248
ハァーーーーーーーー


眠たい

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

253 名前: ◆JAPH9PWA mailto:sage [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 名前:  mailto:age [02/08/06 15:22 ID:???]
>>253
優先度を云々するのなら、= と || および = と or について言わないと意味ナイだろ。

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

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

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



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

257 名前:228 mailto:sage [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 mailto:sage [02/08/10 06:54 ID:???]
>>257
>そのまま使うとエラーでロックを外した瞬間に書き込みが重なってしまう

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

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

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

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

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

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

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

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

261 名前:nobodyさん mailto:age [02/08/11 12:39 ID:???]
結局KENTかよ!!!

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

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

264 名前:nobodyさん mailto:sage [02/08/11 13:46 ID:???]
どこで?

265 名前:KENT mailto:sage [02/08/11 15:40 ID:???]
flockってカエルだよね?



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

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

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

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

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


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

271 名前:nobodyさん mailto:age [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さん mailto:sage [02/08/14 04:31 ID:???]
ヅラを強力ロック

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



276 名前:nobodyさん mailto:sage [02/09/14 03:01 ID:???]
慎吾ママの

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

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

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



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


281 名前:nobodyさん mailto:sage [02/10/08 18:16 ID:???]
>>277
ちょっとワラタ

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

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

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

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



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

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

288 名前: mailto:sage [02/10/22 16:25 ID:???]

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


289 名前:nobodyさん mailto:sage [02/10/22 16:39 ID:???]
>>287
不覚藁

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

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

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

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

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

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

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

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



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

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

use Fcntl qw(:flock);

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

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

299 名前:nobodyさん mailto:age [02/11/03 16:56 ID:???]
大事件発生!

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

300 名前:nobodyさん mailto:sage [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お勉強ちゅー mailto:sage [02/11/29 01:54 ID:???]
↑ open の戻り値チェックしてなかった。スマソ

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



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


308 名前:nobodyさん mailto:sage [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 名前:私も勉強中 mailto:sage [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さん mailto:sage   [02/12/01 00:55 ID:???]
>>309
flock は、とりあえず >>1 の条件に反するので0点ってとこかな?

311 名前:perlお勉強ちゅー mailto:sage [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さん mailto:sage [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]
alink3.uic.to/user/ranran2.html

318 名前:nobodyさん mailto:sage [02/12/02 22:12 ID:???]
オプティミスティック
オプティミスティック
オプティミスティック
ペシミスティック
ペシミスティック
ペシミスティック

あー、言いにくい

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

320 名前:Perlお勉強ちゅー mailto:sage [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さん mailto:sage [02/12/08 08:24 ID:???]
>>321
cronで動かすプログラムとWebプログラムでのファイルのロックが問題なの?
普通のファイルロックと同じようにやればいいじゃん。

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

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

324 名前:nobodyさん mailto:sage   [02/12/08 11:44 ID:???]
やればいいじゃん。

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



326 名前:nobodyさん mailto:sage   [02/12/08 12:11 ID:???]
出てくるんだ?

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

328 名前:山崎渉 mailto:(^^)sage [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さん mailto:sage [03/01/17 13:58 ID:???]
while (!close(ABC)) {}

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

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

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

335 名前:nobodyさん mailto:sage [03/01/18 18:30 ID:???]
>>334
O_APPEND



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

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

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

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

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


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

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

343 名前:nobodyさん [03/01/31 07:27 ID:K4VaGHSu]
いいサイトだ♪homepage3.nifty.com/digikei/ten.html

344 名前:nobodyさん mailto:sage [03/01/31 20:55 ID:???]
安全なようにロックをかけるのが望ましい

345 名前:nobodyさん [03/02/01 03:10 ID:6WMjWs0+]

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

life2.2ch.net/test/read.cgi/offreg/1043075025/l50



346 名前:nobodyさん mailto:sage [03/02/01 03:23 ID:???]
なんだ、騙されたスレじゃないのか

347 名前:nobodyさん mailto:sage [03/02/19 23:23 ID:???]
よくチャックがあけっばなしと言われます

348 名前:山崎渉 mailto:(^^) [03/03/13 17:22 ID:???]
(^^)

349 名前:nobodyさん mailto:sage [03/03/13 22:46 ID:???]
>>329
ログの閉じミスなんて気にしなくても。。。

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

351 名前:nobodyさん [03/04/17 00:56 ID:s+I4ylgd]
Perlメモの
www.din.or.jp/~ohzaki/perl.htm#File_Lock
を使おうと思ったんですが、

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

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

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



352 名前:nobodyさん mailto:sage [03/04/17 02:26 ID:???]
なにも

353 名前:山崎渉 mailto:(^^) [03/04/17 11:58 ID:???]
(^^)

354 名前:351 [03/04/17 22:16 ID:PczzXVDV]
>>352
どういうこと?

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



356 名前:nobodyさん mailto:sage [03/04/17 22:26 ID:???]
>>354
なにげにが気に入らないから教えない

357 名前:bloom [03/04/17 22:56 ID:ahUYqmP+]
www2.leverage.jp/start/

358 名前:nobodyさん mailto:  [03/04/17 22:57 ID:???]
なんでDB使わないの?

359 名前:あぼーん mailto:sage [03/04/17 23:23 ID:???]
 ( ・∀・)/< こんなのみつけたっち♪ 
www.japan.pinkserver.com/yamazaki/saitama/hankaku06.html
www.japan.pinkserver.com/yamazaki/saitama/hankaku05.html
www.japan.pinkserver.com/yamazaki/saitama/hankaku03.html
www.japan.pinkserver.com/yamazaki/saitama/hankaku04.html
www.japan.pinkserver.com/yamazaki/saitama/hankaku01.html
www.japan.pinkserver.com/yamazaki/saitama/hankaku02.html
www.japan.pinkserver.com/yamazaki/saitama/hankaku09.html
www.japan.pinkserver.com/yamazaki/saitama/hankaku10.html
www.japan.pinkserver.com/yamazaki/saitama/hankaku07.html
www.japan.pinkserver.com/yamazaki/saitama/hankaku08.html

360 名前:nobodyさん mailto:sage [03/04/18 23:20 ID:???]
>>358
一回使ったらまた集めなきゃならないだろ。

361 名前:nobodyさん [03/04/19 13:00 ID:EJZQKwDz]
homepage1.nifty.com/glass/tom_neko/web/web_04.html
に載ってる「ファイルを上書きする場合」(↓)
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さん mailto:sage [03/04/19 15:13 ID:???]
>>361
うん、これで問題ないね

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

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

365 名前:山崎渉 mailto:(^^)sage [03/04/20 06:00 ID:???]
   ∧_∧
  (  ^^ )< ぬるぽ(^^)



366 名前:: [03/04/21 18:06 ID:J93Hac+3]
☆^〜^★ 50音順で探せて楽して得する
sagatoku.fc2web.com/
   あなたの探し物きっとみつかるよ☆^〜^★


367 名前:nobodyさん mailto:sage [03/04/21 21:46 ID:???]
>>364
駄目じゃん

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

369 名前:nobodyさん mailto:sage [03/04/21 23:09 ID:???]
>>368
そういう誤魔化し方は好きじゃないな

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

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


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

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

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

375 名前:っていうか mailto:sage [03/04/24 13:03 ID:???]
別ファイルに書き込んで mv
これ定説



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

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

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

  rmdir("lock");

  # 処理

  mkdir("lock");
}

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

379 名前:nobodyさん mailto:sage [03/05/22 10:08 ID:???]
>>378
違う。
if (mkdir ("lock", 755)) {
  (処理)
}

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


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

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


382 名前:nobodyさん mailto:sage [03/05/22 13:53 ID:???]
>>380
ttp://homepage1.nifty.com/glass/tom_neko/web/web_04.html
このへんでも参考に

383 名前:380 じゃないけど mailto:sage [03/05/22 15:06 ID:???]
>>382
激しく参考になりますた。謝謝。

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

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

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


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

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

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



386 名前:nobodyさん mailto:sage [03/05/23 13:28 ID:???]
>>385
見ろ。

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

388 名前:nobodyさん mailto:hage [03/05/28 18:03 ID:???]
age

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

どうすれバインダー。

390 名前:動画直リン [03/05/31 21:10 ID:1EAhrEiJ]
homepage.mac.com/hitomi18/

391 名前:nobodyさん mailto:sage [03/05/31 21:44 ID:???]
>>389
激しくロックの方法に依ると思うんだが。

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

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


394 名前:nobodyさん mailto:sage [03/05/31 23:30 ID:???]
弱いかな?
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 ID:Hll/ZLYf]
>>393
おぉ!蟻がとう。



396 名前:nobodyさん mailto:sage [03/06/01 12:29 ID:???]
>>393
禿げ藁

397 名前:nobodyさん mailto:sage [03/06/01 13:22 ID:???]
>>394
駄目ロック。これ使うならロックしなくていい。

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


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

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

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

401 名前:nobodyさん [03/06/02 10:09 ID:Ixodm31c]
みてね♪
www1.free-city.net/home/s-rf9/page006.html

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




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


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

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

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

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



406 名前:直リン [03/06/02 11:10 ID:mGHfwiJV]
homepage.mac.com/yuuka20/

407 名前:nobodyさん mailto:sage [03/06/02 11:20 ID:???]
>>404-405
0は偽だが、-1は真になる。

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


408 名前:nobodyさん mailto:sage [03/06/02 11:42 ID:???]
>>407
でも絶対-1にはならなくない?

まだ逝ってないよ、俺。

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

--$retry <= 0

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


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


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

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

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

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

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

--$retry <= 0

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

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


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

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

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



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

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

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

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

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

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


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

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

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

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

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



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

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


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

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

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

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




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

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

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


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



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

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

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

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

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

氏のう。。。。

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

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

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

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

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


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

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


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

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

下手な考えスマソ。。。

445 名前:440 mailto:sage [03/07/16 22:09 ID:???]
>>444
ああっと、flockが頭にあったので、、
renameが理想的なロックとして動作するとしたら>>437で可能だと思います。
(OSがlinuxの場合は壊れたりするけど…)

2chとしては、1000で止まらなくても(多少レスが多く付いても)構わないのかも。
(ロックする時間が増える→待ちプロセス数が増える→サーバ負荷が増えるよりは。)



446 名前:437 mailto:sage [03/07/17 00:22 ID:???]
>ロックする時間が増える→待ちプロセス数が増える→サーバ負荷が増える
2chみたいな大規模な掲示板だとここが問題なんですね。
ぐっすり眠れそうな気がしました。レスありがとうございました。

447 名前:nobodyさん mailto:sage [03/07/19 14:28 ID:???]
2ch互換スクリプトの場合、スレ立て処理に問題抱えてる場合があるので注意。
スレッドキー(ファイル名)決定と、ファイル作成(書き込み)を別の場所で
行っている事がほとんどなので、同時にスレ立てが発生するとスレッドが
合体する可能性がある。

半年前あたり2chでもちょっと問題になってた。
実際としては2ch以外で問題になることは無いと思うけどね。

448 名前:nobodyさん mailto:sage [03/07/20 07:55 ID:???]
>>447
スレアドレス決定とファイル作成を同じスクリプトで行えばオッケー?

449 名前:nobodyさん mailto:sage [03/07/20 09:18 ID:???]
>>448
そういうことじゃない。
スクリプトの中でキー決定からファイル作成までの間に
いろいろな処理があって、同時スレ立ての一方がファイル作成前に
もう一方がそのキーのスレがあるか確認して存在しないと
判断してしまう時差の問題が起こりえるということ。

450 名前:nobodyさん [03/07/26 13:13 ID:GHzBAdl/]
flock のロックをしたいんですが、
具体的に何をすれば良いのでしょうか?
flock と言う名前のディレクトリを
作って、ロックしたいファイルに
置いとけば良いのでしょうか?
すいませんが、まるっきりの初心者ですので、
教えて下さい。

451 名前:nobodyさん mailto:sage [03/07/26 13:24 ID:???]
>>450
>>1-449

452 名前:nobodyさん mailto:sage [03/07/26 13:55 ID:???]
>>451
ワロタ!
でも、イイ!

453 名前:_ mailto:sage [03/07/26 13:55 ID:???]
homepage.mac.com/hiroyuki44/

454 名前:nobodyさん mailto:sage [03/07/26 18:00 ID:???]
YOU THE☆ROCKは綴りが違いますが、このスレの親戚ですか?

flockするファイルのあるディレクトリのパーミッションは任意たんでよいですか?
自分の中で最高の条件を満たすレンタル鯖がflock使えないとかなりへこむ。。。
結局rename型のlockにしてみたんだが、鯖の負荷とか考えたくないなぁ。

ブロードバンド回線開通したら絶対鯖立てたい。

と言う独り言でした。また来週。

455 名前:nobodyさん mailto:sage [03/07/26 22:03 ID:???]
やっぱりファイルで何らかのロック処理をした後、
flockも使うのが最強ですかね?



456 名前:nobodyさん mailto:sage [03/07/26 22:40 ID:???]
じっさまなら誰もおこらねぇけど、

457 名前:nobodyさん mailto:sage [03/07/27 01:31 ID:???]
>>455
ハァ、Webプログラマーってどうして馬鹿ばっか集まるんだ。
排他制御に強い/弱いはない。正しい/駄目のどちらかだ。
駄目なものをいくつ重ねても駄目なものは駄目。正しい方法を複数使う必要はない。

458 名前:nobodyさん mailto:sage [03/07/27 03:14 ID:???]
結論が出てしまったな・・・

459 名前:nobodyさん mailto:sage [03/07/27 09:30 ID:???]
ドコ━━━(゚Д゚≡(゚Д゚≡゚Д゚)≡゚Д゚)━━━━!!!!???

460 名前:nobodyさん mailto:sage [03/07/27 20:51 ID:???]
Iriaにセキュリティーホールらしいぞ。
tv3.2ch.net/test/read.cgi/geino/1050253651/377


461 名前:nobodyさん mailto:sage [03/08/04 22:07 ID:???]
今の今までflockできないとおもってたが、パーミッション777で解決しちった。

462 名前:nobodyさん [03/08/06 01:55 ID:pOGj2Sy2]
てす

463 名前:nobodyさん [03/08/06 01:56 ID:pOGj2Sy2]
てすてす

464 名前:nobodyさん [03/08/06 01:56 ID:pOGj2Sy2]


465 名前:nobodyさん [03/08/07 14:03 ID:fxtSTKIN]
ちょっと思った。
use Fcntl;
をしといて、
sysopen
を使ってLOCK_EXとか呼べないかな。



466 名前:nobodyさん mailto:sage [03/08/07 14:18 ID:???]
意味不明。
LOCK_EXは定数(を返すだけのsub)

467 名前:nobodyさん mailto:sage [03/08/07 15:00 ID:???]
use Fcntl;
sysopen FILE,"hoge",O_RDWR|O_CREAT|LOCK_EX;
みたいなことできるかってこと?
試してみてね。
俺は知らん。

468 名前:nobodyさん mailto:sage [03/08/08 01:36 ID:???]
>>465
use Fcntl;するならO_SHLOCKとO_EXLOCKが使えるでしょ。
Win系はシラネ。

469 名前:nobodyさん mailto:sage [03/08/08 04:05 ID:???]
>>465
うん、使える。
O_EXLOCKを使ってsysopenで書いてあげたら
もっとスマートなlockができそう。

470 名前:nobodyさん mailto:sage [03/08/09 22:15 ID:???]
>>465
use IO::File::fock;
my $fh = new IO::File::fock('file','>>');


471 名前:山崎 渉 mailto:(^^) [03/08/15 22:42 ID:???]
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン

472 名前:nobodyさん mailto:sage [03/08/24 11:20 ID:???]
flock使えます。
追記の場合って、どうするのが一番確実で負荷がかかんないんでしょうか?
僕は、データを編集する場合と同じように、以下のようにしちゃってますが。use Fcntl qw(:flock);
#万が一リネーム失敗したときのために、ユニークなファイル名にしておく
$tmpfile = "$datafile".".$$.". time() .".csv";
#ロックファイルを作成する(★注:ロックファイルは、各CSVごとにユニークに)
open (LOCKF, ">$datafile"."_lockf") or die("cannot open:$!");
    flock (LOCKF, LOCK_EX);    #ロックファイルをflockする
    open(IN, "< $datafile") or die("cannot open:$!"); # 読みのみモードで開く
        open(TMP,"> $tmpfile"); #テンポラリファイルを作成
            while ($line = <IN>){
                $line .= <IN> while ($line =~ tr/"// % 2 and !eof(IN));
                $line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
                @values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_}
                 ($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
                #必要なものだけをEUCにして、出力時にSJISにする
                foreach $value (@values){
                    &jcode::convert(\$value, "euc");
                };
                #CSV形式に変換
                $newline = join ',', map {(s/"/""/g or /[\r\n,]/) ? qq("$_") : $_} @values;
                print TMP "$newline\n" ;#テンポラリファイルに1レコード書き込み
            }
            print TMP "新しい行" . "\n";
        close TMP;
    close IN;
    unlink $datafile;
    rename ($tmpfile, $datafile) or die ("cannot rename : $!");
close LOCKF;


473 名前:472 [03/08/24 11:25 ID:xfHM1yWk]
あ、よく考えたら、既存の行をいちいち@valuesにする必要はないんだ・・・
訂正。
↓これでどうでしょか?

use Fcntl qw(:flock);
#万が一リネーム失敗したときのために、ユニークなファイル名にしておく
$tmpfile = "$datafile".".$$.". time() .".csv";
#ロックファイルを作成する(★注:ロックファイルは、各CSVごとにユニークに)
open (LOCKF, ">$datafile"."_lockf") or die("cannot open:$!");
    flock (LOCKF, LOCK_EX);    #ロックファイルをflockする
    open(IN, "< $datafile") or die("cannot open:$!"); # 読みのみモードで開く
        open(TMP,"> $tmpfile"); #テンポラリファイルを作成
            while ($line = <IN>){
                print TMP $line ;
            }
            print TMP "新しい行" . "\n";
        close TMP;
    close IN;
    unlink $datafile;
    rename ($tmpfile, $datafile) or die ("cannot rename : $!");
close LOCKF;



474 名前:472 [03/08/24 11:57 ID:xfHM1yWk]
あるいはもう1つの選択枝。
単純に、

use Fcntl qw(:flock);
open(OUT, "+< $datafile");
    flock (LOCKF, LOCK_EX);
        truncate(OUT, 0);          # ファイルサイズを0バイトにする
        seek(OUT, 0, 0);            # ファイルポインタを先頭にセット
        print OUT "新しい行" . "\n";;  # 書き込む
close(OUT);                     # closeすれば自動でロック解除

・・・・どっちがいいのでしょうか・・・?

475 名前:nobodyさん mailto:sage [03/08/24 12:53 ID:???]
>>474
追記なら

use Fcntl qw(:flock);
open(OUT, ">>$datafile");
    flock (OUT, LOCK_EX);
        seek(OUT, 0, 2);           # ファイルポインタを最後尾にセット(念のため)
        print OUT "新しい行" . "\n";;  # 書き込む
close(OUT);                     # closeすれば自動でロック解除

--
# 私はこんな感じ(Win不可)
use FileHnadle;
my $fh = new FileHandle($datafile, O_WRONLY|O_CREAT|O_APPEND|O_EXLOCK) or die;
print $fh '新しい行', "\n";
close($fh);

IO::Fileでもいいんだけど、趣味でFileHandle使ってます。



476 名前:nobodyさん mailto:sage [03/08/27 11:26 ID:???]
某K氏のアクセス解析でFlock使うようにしようとしたのですが

open(LOG, ">$logfile") or &error("Open Error : $logfile");
flock(LOG, 2);
seek(LOG, 0, 2);
my(@lines) = <LOG>;

(if($agent =~ /MSIE 3/i) { $agent = 'MSIE 3'; }のような置換とか)

while($max-1 < @lines) { pop(@lines); }
unshift(@lines, "$agent<>$os<>$host<>$referer<>$hour<>$doc_uri<>\n");
unshift(@lines, "$addr\n");

print LOG @lines;
close(LOG);

こうすると書き込み時にログが一旦全部消えてしまい、
取得した最後のログ一行(先頭行に最終アクセスIPがあるので正確には二行)のみになってしまいます。
何処が悪いのでしょうか…

因みに元スクリプトではログを配列に読み込んだ時点で一旦閉じ、
処理後もう一度開いて書き込みという風になってたのですが、
これだと処理中に書き込まれたら駄目そうな気がしたので上のように書き換えたのです。


477 名前:nobodyさん mailto:sage [03/08/27 19:09 ID:???]
>>476
lockどうこうより、while がおかしいのでは?
$max-1 < @lines がどういう比較かわからんけど、自分で
pop(@lines);して削除しちゃってるじゃないの
常にwhileが真で全行削除になってその後unshiftで2行追加してるだけでは?

478 名前:nobodyさん mailto:sage [03/08/27 21:08 ID:???]
>open(LOG, ">$logfile") or &error("Open Error : $logfile");
'>'でオープンすると?
・ファイルの中身を切り詰める。
・書き込み専用でオープンする(ファイルが無ければ作成)。

>seek(LOG, 0, 2);
この意味は?
・フィル最後尾にファイルハンドルを移動する。

さすがに読めません。

479 名前:nobodyさん mailto:sage [03/08/27 21:09 ID:???]
open(LOG, "+<$logfile") or &error("Open Error : $logfile");
flock(LOG, 2);
my (@lines) = <LOG>;

(ロックスレなので、、略)

seek(LOG, 0, 0);
truncate(LOG, 0);
print LOG @lines;
close(LOG);

上の書き方では、seekとtruncateの間で終了させられると、
ファイルの中身が失う危険性があるから、

seek(LOG, 0, 0);
print LOG @lines;
truncate(LOG, ftell(LOG));
close(LOG);

と書くといいらしいです。(実際はどうなんでしょ?)

www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq5.html#How_come_when_I_open_the_file_re
www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq5.html#I_still_don_t_get_locking_I_jus
クックブック 7.11
ttp://homepage1.nifty.com/glass/tom_neko/web/web_04.html

480 名前:479 mailto:sage [03/08/27 22:53 ID:???]
>truncate(LOG, ftell(LOG));
間違いでした。以下の通り。
truncate(LOG, tell(LOG));

481 名前:nobodyさん mailto:sage [03/08/28 11:06 ID:???]
ログだったら、追記で開いて、flockしてファイルの尻seekするだけじゃ
だめなの?

482 名前:nobodyさん [03/08/31 01:47 ID:3rubdTEF]
あるサイトでみたんだけど、
use DB_File;
use Fcntl;
open DAT,"lockfile";
flock(DAT,LOCK_EX);
tie(%hash,'DB_File',"dbfile",O_RDWR|O_CREAT,0666
---DBM代入処理
としてロックしてました。
lockfileというファイルへの排他ロックを取得しているのは
わかるんだけど、それがどうしてDBMのdbfileへのロックと
なるのかわからん。

483 名前:nobodyさん mailto:sage [03/08/31 04:22 ID:???]
>>482
「dbfileを使うプロセスは、かならずdbfileにアクセスする前にlockfileをロックする」
という紳士協定があればうまく行く。

dbfileにアクセスするのが>>482のスクリプトだけの場合も然り。

それでもなぜか分からないなら良く考えてみ。

484 名前:nobodyさん mailto:sage [03/08/31 20:24 ID:???]
>>482
ブロッキングを理解すると分かると思います。

flockでロックされると、LOCK_NBを指定していない限り、
排他される側はflock関数の場所で処理を止められます。

485 名前:482 [03/08/31 22:31 ID:3rubdTEF]
tieする前に必ずファイルロック処理する。
flockをLOCK_SHでした場合は%hashへの代入はしない。
上を全てのdbfileを使う処理でする。
この順番を守ればflockの段階でブロックしてtieへ進まない。
やっと、すっきりした。
>>483.484さんありがとー



486 名前:nobodyさん mailto:sage [03/08/31 23:56 ID:???]
ついでですが、ファイルを排他ロック(LOCK_EX)するときは、
書き込みできる状態でファイルをオープンしないとロックしない
OSがあるそうです。ご注意あれ。

参考:
同じ(ような)処理をするモジュール。
search.cpan.org/author/DHARRIS/DB_File-Lock-0.05/Lock.pm

487 名前:482 mailto:sage [03/09/01 01:40 ID:???]
>>486
open LOCK,'<lockfile';
ってするてことですね。気をつけます。
このモジュール結構便利ですね。
ありがとございます。
perlの面白みにはまっっていく・・土日外にでてねえ・・

488 名前:nobodyさん mailto:sage [03/09/01 19:13 ID:???]
LOCK_SHしといて、STORE〜SYNCまでの間LOCK_EXにして
SYNCがかかったらSHにもどしちゃダメ?
LOCK_EXの時間は短い方がいいとおもうんだけど

489 名前:nobodyさん mailto:sage [03/09/01 22:19 ID:???]
>>488
魅力的ですが、共有ロック(LOCK_SH)をしているところに
排他ロック(LOCK_EX)をしようとすると、
ブロックされて待たされることになります。

書き込む事がほとんどないのであれば、
検討する価値はあるかも。

ロックしたら、操作、すぐ開放が基本です。

490 名前:488 mailto:sage [03/09/02 11:52 ID:???]
> 魅力的ですが、共有ロック(LOCK_SH)をしているところに
> 排他ロック(LOCK_EX)をしようとすると、
> ブロックされて待たされることになります。
同じプロセスならLOCK_SHからLOCK_EXへ移行できちゃったんですが...


491 名前:nobodyさん mailto:sage [03/09/02 20:13 ID:???]
言いたかったのは、こんなイメージです。

 processA     processB
   |         |
flock(F, LOCK_SH);   |
   |         |
  処理    flock(F, LOCK_EX);
   |          :
   |          :  (ブロックされる)
   |          :
 close(F);       処理 (ここで処理開始)
   |         |
   exit;        |
            close(F);
              |
             exit;

492 名前:490 mailto:sage [03/09/04 22:14 ID:???]
そっか、タイミングがちょっと遅くなるだけで、結局待たされるんだ。。。
って事でwww.perldoc.jp/docs/modules/DB_File-1.805/DB_File.poをみると・・・
まともにロックしたかったらBerkeleyDBを使えっと(´Д`;)



493 名前:nobodyさん [03/09/06 01:39 ID:A9Khhwgn]
flockでここまでスレが伸びるのか・・・。
漏れなら小規模の場合は消えるの覚悟で単純にflockだけ(面倒)。
中規模以上はDB立ててDBのLOCKで対処。

これじゃいかんのか?

494 名前:nobodyさん mailto:sage [03/09/06 02:09 ID:???]
俺もDBマンセー

495 名前:nobodyさん mailto:sage [03/09/06 03:10 ID:???]
>>493
flockで消えちゃうのは、何かお前のやり方に問題があるんだと思うぞ。
システム自体がflockの堅牢性に頼っていると言うのに。



496 名前:nobodyさん mailto:sage [03/09/07 02:25 ID:???]
flockにも限界があるので、できるなら餅は餅屋に任せるのがいいと思いますよ。

497 名前:nobodyさん mailto:sage [03/09/07 10:06 ID:???]
>>496
限界って?
Windowsやover networkでうまく働かない以外に何か問題あったっけ?

だいたいflock使えねーとか言ってるヤツのコードみると書き方間違ってる
だけだったりするんだよな。

ごちゃごちゃ言う前にモジュール使えってのはまぁ同意だけど。

498 名前:nobodyさん [03/09/07 14:44 ID:AN0xO5Ef]
>Windowsやover networkでうまく働かない以外に何か問題あったっけ?

ありますよ。ご自分でお調べください。

499 名前:nobodyさん mailto:sage [03/09/07 15:01 ID:???]
>>498
あとは昔のOSでバッファをフラッシュしないくらいしか思いつかないなあ。

UN*X系のOSで別に正しく使えばファイルが消えちゃうとかはないでしょ?

500 名前:nobodyさん mailto:sage [03/09/07 15:03 ID:???]
UNIX系でflockに対応してないものもある、見たいなのを読んだ事があるけど本当ですかね?

501 名前:nobodyさん mailto:sage [03/09/07 15:04 ID:???]
>>499
>>496=498は適当に言ってるだけですよ。

502 名前:nobodyさん mailto:sage [03/09/07 15:14 ID:???]
そんな感じだな

503 名前:496 mailto:sage [03/09/07 19:04 ID:???]
>>497
flockでデータベースを丸ごとロックするより、
他の方法を使ったほうが限界性能が上がると言いたかったのですが…。

別の話として。
>Windowsやover networkでうまく働かない以外に何か問題あったっけ?
ActivePerlの場合、WIN32APIのLockFileEXが使えれば、Windowsでも使えます。
そして、それはうまく働きます。

私はflock(2)の信頼性を否定しません。
とはいえ、perlのflockについてはperldocに例外事項が書かれています。
(498さんの言いたかったのはこれかな)

perlのflock関数 = flock(2)であるとは限りません。

参考:
perldoc -f flcok
perlソース pp_sync.c
ActivePerlソース win32.c

504 名前:nobodyさん mailto:sage [03/09/07 22:04 ID:???]
>>503
おいおい、何はぐらかしてんだ?
>Windowsやover networkでうまく働かない以外に何か問題あったっけ?

>他の方法を使ったほうが限界性能が上がると言いたかったのですが…。
他の方法とは?

505 名前:nobodyさん [03/09/07 22:26 ID:K46D6zau]
flockからunlockまでの途中で強引に処理を止めて、同じcgiを複数
起動させればflockの信頼性が判るよ。いくつかはロックかからずに
スルーされるからさ。

後はロックの残骸による次プロセス(同一ロック)の停止かな。
遠回りしないと解決出来ないのは面倒。

漏れが間違っているかもしれんが、同時に数千〜数万単位でロックを
必要とする環境に置いて上記の理由からflockは使いたくないです。
よってほとんどDBのロックに任せっきり。DBだと単純なa=a+1の場合だと
DB自体が保証してるんでロック不必要だし。

間違っていたら本当にスマソ。業務でロックを故意に壊しにいった結果
こうなったので。



506 名前:nobodyさん mailto:sage [03/09/07 22:35 ID:???]
>>505
ソースとdfの結果みせてみな。

そういうケースの殆どはファイルシステムがNFSだった、って
オチな訳だが。

もし本当にflock(2)に信頼性がないなら、sendmailがmailboxファイルを消しまくる
現象が世界中で起きてるはずだが。

> 後はロックの残骸による次プロセス(同一ロック)の停止かな。

・・・は?

> 間違っていたら本当にスマソ。

多分間違ってると思う。

507 名前:nobodyさん mailto:sage [03/09/07 23:19 ID:???]
>>505
>いくつかはロックかからずにスルーされるからさ。
どうやって判断してんだ。テストコードがバグってんだろ。よくあることだ。

>ロックの残骸
って何?

>flockは使いたくないです。
>よってほとんどDBのロックに任せっきり
・・・

508 名前:nobodyさん mailto:sage [03/09/07 23:54 ID:???]
最近は、凧や独楽を買ったものの、子供がうまく使いこなせずに「不良品じゃないのか!」と
店に怒鳴り込む馬鹿親がいると聞きますが・・・。

この業界にも、道具を使いこなす努力をせずに、自分の無能を全部道具のせいにする
DQNが増えてきたってことですかね。

509 名前:nobodyさん mailto:sage [03/09/08 10:14 ID:???]
>508
ハゲドウ

しかし、不良だらけの道具を平気で売ってる大企業とかも在るのが実情ではある。
M$とか。

510 名前:496 mailto:sage [03/09/08 13:21 ID:???]
>おいおい、何はぐらかしてんだ?
>>Windowsやover networkでうまく働かない以外に何か問題あったっけ?

perldoc -f flockから引用
>Calls flock(2), or an emulation of it, on FILEHANDLE. Returns
>true for success, false on failure. Produces a fatal error if
>used on a machine that doesn't implement flock(2), fcntl(2)
>locking, or lockf(3).

>On systems that support a real flock(), locks are inherited
>across fork() calls, whereas those that must resort to the more
>capricious fcntl() function lose the locks, making it harder to
>write servers.

というように、いい加減なfnctl(2)によりエミュレーションされた場合は
サーバーの書き込みが激しい場合ロックが失われると書いてあります。

>>他の方法を使ったほうが限界性能が上がると言いたかったのですが…。
>他の方法とは?

データベース側に専用のロック機構があれば、そちらにお任せしますが?
全部flockしますか?

511 名前:nobodyさん mailto:sage [03/09/08 23:47 ID:???]
>>510=>>496
こいつ何言ってんだ?勝手にデータベース使うな。

512 名前:nobodyさん mailto:sage [03/09/09 02:09 ID:???]
>>510
んじゃ、perlにflock(2)の呼び出しが実装されてれば問題がないということでよろしい
でしょうか?

俺は思わず「fcntlがダメダメ -> POSIX準拠と呼べない -> UNIX系とも呼べない」
と思ってしまったが。

513 名前:496 mailto:sage [03/09/09 20:09 ID:???]
>>512
flock(2)が機能して、正しく使えていれば問題ないかと。
私の知る限りでは、fcntl(2)でも十分信頼性はあると思いますけどね。

514 名前:nobodyさん [03/09/12 14:11 ID:e1VX9Ox6]
flock(2)とPerlのflockを混同するから話がややこしくなるんだよな。

flock(2)はover networkじゃなく、正しく使えば基本的に堅牢。
Perlのflockはコンパイルされた環境依存、ってとこか。
fcntlでもちゃんとPOSIXに準拠してれば問題ないはず。

その腐ったfcntlを実装してるOSが何なのか知りたい。
Larryの事だから、誰も使わないようなかなりマイナーな物を
想定しているような気がするが。

しかしfcntlは堅牢でないからDBを使う、といってる人がいたが、
じゃぁそのDBはどうやってファイルをロックしてるんだろう?

515 名前:nobodyさん mailto:sage [03/09/12 19:43 ID:???]
システムのロック以上の能力を持つロックは不可能です。

と言い切ってみるテスト…。



516 名前:nobodyさん mailto:sage [03/09/13 00:45 ID:???]
fcntl がクソな実装を具体的に挙げられない限り、flock 否定派の香具師は議論にならん。

517 名前:nobodyさん mailto:sage [03/09/13 23:39 ID:???]
>>516
UNIX系ならまず大丈夫、ということで良いだろ。
fcntl失敗する時点でUNIX失格だからな。

518 名前:nobodyさん mailto:sage [03/09/14 21:13 ID:???]
>>514
PostgreSQLだったらセマフォ。

>>517
qmail.jp/mta/spool.htmlでも触れられているが、
NFSでlockdが腐る現象がまれに発生する事を実際に経験している。
(俺は信者じゃない)

519 名前:518 mailto:sage [03/09/14 21:24 ID:???]
> PostgreSQLだったらセマフォ。
これ、やっぱ嘘かも。
しかし、排他制御のプリミティブはfcntlやflockだけではない。

520 名前:nobodyさん mailto:sage [03/09/15 06:39 ID:???]
突然だけどflockってなんて読んでる?

521 名前:nobodyさん mailto:sage [03/09/15 06:42 ID:???]
えふろっく

522 名前:nobodyさん mailto:sage [03/09/15 07:54 ID:???]
ファイナルロック>510


523 名前:nobodyさん mailto:sage [03/09/15 10:38 ID:???]
限界でもファイルロックだろうね。

524 名前:nobodyさん mailto:sage [03/09/15 17:19 ID:???]
search.cpan.orgで、flockとかfile lockをキーで引いてみると
結構でてくるのですが、どれかお勧めはありますか?
それとも毎回自分で処理を書いたほうがいいのでしょうか?


525 名前:nobodyさん mailto:sage [03/09/15 18:11 ID:???]
このスレでそんな質問しても無駄。
「flock は腐ってる。 DB 使え」という答えしか返ってこない。



526 名前:nobodyさん mailto:sage [03/09/15 23:20 ID:???]
>>524
それぞれ用途が違うから、必要に応じて使えばいい。

527 名前:nobodyさん mailto:sage [03/09/15 23:44 ID:???]
>>525
そんなこと書いてるのは約一名だろ。

>>524
perl -MConfig -e 'print $Config{d_flock}."\n"'

これ実行して「define」と出ればflock(2)が実装されてるからまず大丈夫。
ネットワーク越しでなければラクダ本に書いてあるflockのサンプルで充分。

528 名前:nobodyさん mailto:sage [03/09/16 00:04 ID:???]
ラクダ本の見て必要無いのにseek(FH, 0, 2)とかやってる奴
何人か見た事あるので充分なのかどうかは微妙とか言ってみるテスツ。


529 名前:nobodyさん mailto:sage [03/09/16 01:04 ID:???]
最近はseek(FH, 0, 2)いらんよね

530 名前:nobodyさん mailto:sage [03/09/16 02:04 ID:???]
>>528
別にseekやってもオーバーヘッド以外の害はないんだし、害がある場合もレアケースながら
存在するので、的確かどうかはともかく、少なくとも「充分」ではあるのでは?

531 名前:nobodyさん mailto:sage [03/09/27 12:58 ID:???]
こんなロック処理はどうだ?

mkdirで新規ディレクトリを作ったうえで、ロック成立条件を満たした場合にロック完了とする。
ディレクトリ名にタイムアウト時刻と共有/排他ロックの種別を埋め込む。

共有ロック時はディレクトリ作成後に、親ディレクトリのファイルリストを取得して、
自分の作ったディレクトリよりも前に排他ロックディレクトリが作成されていなければ、ロック完了。
排他ロック時も同様に、自分の作ったディレクトリよりも前にディレクトリが作成されていなければ、ロック完了。
もちろん、ファイルリスト取得時にタイムアウト時刻を過ぎたディレクトリは消去する。

環境依存せずに、read-write lock patternをperlで実装するとこうなるね。

532 名前:nobodyさん mailto:sage [03/09/29 13:16 ID:???]
環境依存せずに。。。という話なんだけど、
flockサポートしてない環境ってそんなに一杯あるんですか?
windows 9xでサーバ立てる香具師はほっといたとして、、、
nkfのlock機構って精度低いんですか?


533 名前:nobodyさん mailto:sage [03/09/30 04:58 ID:???]
>>532
nkf の lock 機構ってのは聞いたことないんだが、

・・・っていうか、一体いつまでおんなじような議論を堂々巡りで続ける気なんですか?!?!

534 名前:nobodyさん mailto:sage [03/09/30 05:00 ID:???]
あ、ところで、 >>531 の方法は、
なかなか良さげっていうか、問題無さそうな気がするんですがどうなんでしょうね?

535 名前:532 mailto:sage [03/09/30 11:52 ID:???]
nfsの間違えでした(スマソ



536 名前:nobodyさん mailto:sage [03/09/30 12:29 ID:???]
>>534
ほぼ同じ仕様のコードが既に公開されてて、有難く使わせて頂いてます。

537 名前:531 mailto:sage [03/09/30 17:11 ID:???]
>>536
どこで公開されてたか教えれ!

538 名前:nobodyさん mailto:sage [03/10/02 03:29 ID:???]
>>536
もしかして、ここかしら?
ttp://www.mindcompass.sfcgi.com/200303.html

539 名前:531 mailto:sage [03/10/02 09:02 ID:???]
>>538
やっぱうちのサイトですか(w

で、今改良版を作ってるのですが、タイムアウト時刻をディレクトリ名にすると、同時にタイムアウト時刻が
違うロックを作ると誤動作するな。

だから、現在時刻をディレクトリ名にして、ディレクトリの作成時刻をタイムアウト時刻に変更すると言う
アクロバティックな操作が必要かもね。

改良版出来上がったら公開しますか?(y/n)



540 名前:nobodyさん mailto:sage [03/10/02 16:33 ID:???]
>>539

自作CGIを評価するスレ
pc2.2ch.net/test/read.cgi/php/1049514428/470

何これ。恥ずかしがりやさんなのかな。


541 名前:nobodyさん mailto:sage [03/10/02 22:14 ID:???]
>>540
さんくす。こんなスレがあるとは知りませんですた。
さっそくそっちのほうにageてみました。

542 名前:nobodyさん mailto:sage [03/10/03 18:38 ID:???]
>>541
いやいや何か勘違いしてない?
ファイルロックの話なんだからこのスレでいいだろう。

俺の言いたかったのは>>539の最後に(y/n)があって、
何故かpc2.2ch.net/test/read.cgi/php/1049514428/470
yと答えてたので報告したまでです。


543 名前:nobodyさん mailto:sage [03/10/03 18:51 ID:???]
>>531
これって安全そうでよさげな気はするんだけど、
ちょっと思ったんだけど、ものすごくアクセス多い場合に、
ディレクトリ作成〜ファイルリスト検査のタイムラグのせいで、
いつまでたってもだれもロックを取得できない、ってな状況になりそうな気がする。

544 名前:531 mailto:sage [03/10/05 10:57 ID:???]
新バージョンageてみました。
今度の奴は、ロックする側のプロセスがタイムアウト時間を個別に設定できます。

do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/index.html

>>543
確かにファイルリスト検査に時間がかかるが、ならばどうしろと?


545 名前:nobodyさん mailto:sage [03/10/06 12:54 ID:???]
>>544
いや、どうすればいいか私にも思い付きません。すいません。
単にデメリットを挙げてみただけで、
だからといってその方法が使えねーとかいう気も毛頭ありません。



546 名前:531 mailto:sage [03/10/06 22:56 ID:???]
>>544>>545
さらに一念発起してrename方式に変更してロック処理にかかる負荷を低減してみました。

rename方式でテストしたらロックがぶっ壊れるなー、とか思ってたら
ロック検証用のルーチンの書き方に問題があった罠。
同じファイルを読み込みと書き込みで2回オープンして、しかもバッファ処理をカットしてなかったので、
スクリプト上では書き込んだつもりでもファイルシステム上では「まだ」書き込まれてない場合があることに
ようやく気がついた。

教訓。
ロック処理が正しくても、ファイル入出力の部分の書き方によっては思わぬファイル破損がありうる。

547 名前:531 mailto:sage [03/10/07 18:17 ID:???]
>>546
やっぱりread-write lockってむづかしいでつね。
rename方式だと、共有ロックをかけているプロセス数が分からないといつロック解除していいかわからない。
ロックプロセス数を安全に記録するために、内部で排他ロックをかけなければいけない罠w
これでどのくらいロック処理で負荷がかかるか、だな。


548 名前:nobodyさん mailto:sage [03/10/29 05:07 ID:???]
複数ファイルにまとめてロックを掛けるにはどうすれば良いのですか?

例えば掲示板で最初のページだけ静的なファイルにしたいという場合、
ログとその最初のページの両方を同時にロックしないといけないので。

FLOCKのディレクトリ版とかあれば便利なのですが…。


549 名前:nobodyさん mailto:sage [03/10/29 06:01 ID:???]
>>548
ロック開始と解除の間で必要なファイルを扱えばいいだけ

ロックの仕組みを根本的に理解していないんじゃないか?
もうちょっと勉強せい

550 名前:nobodyさん mailto:sage [03/10/29 08:13 ID:???]
【Perl】ファイルロック(排泄処理)について語ろう
pc2.2ch.net/test/read.cgi/php/1024795138/

551 名前:nobodyさん mailto:sage [03/11/03 16:44 ID:???]
>548
ttp://www98.sakura.ne.jp/~jun/perl/flock.html#02


552 名前:nobodyさん mailto:sage [03/11/05 02:38 ID:???]
>551
flockってロックしたファイルが閉じるまでに開いた他のファイルまで
全部ロックしちゃうの?


553 名前:nobodyさん mailto:sage [03/11/05 04:25 ID:???]
>>552
お前、リンク先のサイトの内容ちゃんと読んだか?

554 名前:nobodyさん mailto:sage [03/11/05 11:35 ID:???]
>>551
リンク先面白かった。初心者にもわかりやすい情報をWebで公開してくれる人って、尊敬。

555 名前:nobodyさん mailto:sage [03/11/05 14:16 ID:???]
>>553
読んだけど。
かいつまんで書くと

lockfileを開く
lockfileをロック
count.txtを開く
上書き
count.txtを閉じる
addr.txtを開く
追記
addr.txtを閉じる
lockfileをアンロック

だよね。
count.txtとaddr.txtには直接ロックかけてなくて
lockfileをロックすることによりこの二つのファイルもロックされてるらしいから
>551みたいに言った。




556 名前:nobodyさん mailto:sage [03/11/05 14:16 ID:???]
552だ。

557 名前:nobodyさん mailto:sage [03/11/05 14:28 ID:???]
ああ何となく解ってきた。
よく考えたらlockfileがロックされてるときはそこから先に進まないから大丈夫なのか。


558 名前:nobodyさん mailto:sage [03/11/08 02:04 ID:???]
ロック用ファイル作らなくても
どっちかのファイルにロックかけて最後まで開いてるままで十分だけどな。


559 名前:nobodyさん mailto:sage [03/11/08 13:26 ID:???]
>>558
あんた無茶苦茶言いますなぁ・・・

560 名前:nobodyさん mailto:sage [03/11/08 13:37 ID:???]
無茶苦茶???いったい何が???

561 名前:nobodyさん mailto:sage [03/11/08 15:28 ID:???]
>>559
count.txtにロックかけてそのままabbr.txtの処理終わるまで開いときゃ良いじゃん。


562 名前:nobodyさん mailto:sage [03/11/08 17:35 ID:???]
addrだった。

563 名前:nobodyさん mailto:sage [03/11/09 03:10 ID:???]
>>561
レアケースだろうけど
似たような事して壊れたことあるよ
無茶苦茶って事では無いだろうが、
そのやり方だと同時オープンで
2人アクセスしてきたのに1しかカウントアップしないって
ケースがタイミング良ければ発生する程度かな

564 名前:nobodyさん mailto:sage [03/11/09 10:32 ID:???]
>>561
どうやってロックするんですか?

565 名前:nobodyさん mailto:sage [03/11/09 14:47 ID:???]
>>563
なんでそうなる?単にヘボ実装だっただけじゃないの?



566 名前:nobodyさん mailto:sage [03/11/09 15:19 ID:???]
>>563
なるわけないだろうが

567 名前:nobodyさん mailto:sage [03/11/09 18:12 ID:???]
>563
単に読み込みをブロックしてなかっただけってオチなんじゃ。
それか二つのファイルでファイルハンドルを同じにしちゃったとか…。

>564
open(COUNT, "+<$cfile");
flock(COUNT, 2);
(中略)
open(ADDR, ">>$afile");
(中略)
close(ADDR);
couse(COUNT);


568 名前:nobodyさん mailto:sage [03/11/09 18:18 ID:???]
ちょっと複雑なシステムで
複数のスクリプトが複数の同じファイルを読み書きする場合は
ロック用ファイルを一つ用意する方が管理が楽なのは当たり前。

でもカウンターのようにファイルが単一のスクリプトからしか読み書きされない場合は
どちらか先に読む方のファイルをロックしておけば十分。


569 名前:nobodyさん mailto:sage [03/11/09 18:46 ID:???]
>>565
>>566
無能か?(w
ググルとたくさんでてくるぞ、そのケース

570 名前:nobodyさん mailto:sage [03/11/09 18:58 ID:???]
わけわかんね。
サーバがflockをきちんと使えないシステムを採用してたとかじゃないの?


571 名前:nobodyさん mailto:sage [03/11/09 19:03 ID:???]
>>569
きっと君と同じぐらい無能なやつなんだろうね
ここでそんなこと言ってるのも君ぐらいだし

572 名前:nobodyさん [03/11/09 19:42 ID:BVCYv2fe]
>>570,571
馴れ合いはよそでやれよ・・・
ま、>>555は書いてるとうりにすれば問題無し
わざわざ混乱させんでもよかろうに

573 名前:572 mailto:sage [03/11/09 19:48 ID:???]
ageちまっていいスレだよな・・・

それか、
>>567-571はジエン厨じゃあなかろうなぁ?


574 名前:nobodyさん [03/11/09 19:55 ID:4SnYD/Cs]
 | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
 |.本日選挙は20時迄!|
 |__________|
   ∧∧ ||
   ( ゚д゚)|| <残り10分切ったど!
   / づ     投票してない香具師は自衛隊の代わりにイラク逝けよ。

※総務省によると、総選挙の中間投票状況は
9日午後4時現在、全国平均で40.04%。前回を1.40ポイント下回っている。

575 名前:nobodyさん mailto:sage [03/11/09 19:59 ID:???]
>>573
あれが自演ならお前さんも>>569か?って事になるじゃん…。
本当だったら煽った挙句自演呼ばわりですかって感じで笑えるけど。




576 名前:nobodyさん mailto:sage [03/11/09 20:28 ID:???]
>>569
ハァ?
じゃあ「そのケース」とやらをここに貼れよ。
そのヘボ実装を検証してみようや。

577 名前:nobodyさん mailto:sage [03/11/09 20:54 ID:???]
>>572
馴れ合い?

578 名前:nobodyさん mailto:sage [03/11/09 21:14 ID:???]
>>577
「馴れ合い」の意味を知らないだけだろ。無知は構うな。ほっとけ。

579 名前:564 mailto:sage [03/11/10 14:47 ID:???]
あれ?flockが使える環境の人もこのスレの需要あったの?
まぁどっちでもこの場合変わらないけど。

580 名前:nobodyさん mailto:sage [03/11/10 14:53 ID:???]
>>561が勝手にflockと勘違いして
勝手に自分のやり方を押しつけたって事かぁ(・∀・)

581 名前:nobodyさん mailto:sage [03/11/10 16:11 ID:???]
>>580
ということにしたいのですね? :-)

582 名前:nobodyさん mailto:sage [03/11/10 16:19 ID:???]
もうほっとけほっとけ

583 名前:nobodyさん mailto:sage [03/11/10 16:43 ID:???]
♪か〜な〜しみ〜に〜であうた〜び〜

584 名前:nobodyさん mailto:sage [03/11/10 16:56 ID:???]
↓【Perl】flock() の使えない環境下でのファイルロック(排他処理)について語ろう

585 名前:nobodyさん mailto:sage [03/11/10 20:26 ID:???]
俺ん中の結論はRename形で、不雑なものになると管理が難しくなるんだよなぁ



586 名前:nobodyさん mailto:sage [03/11/10 20:34 ID:???]
>>585
何の管理?

587 名前:nobodyさん mailto:sage [03/11/10 20:37 ID:???]
同じディレクトリに複数のDATがある場合
ユニークなファイル名を生成するようにしないと。

…今思ったけど、たいした事無いなw

588 名前:蟻の子一匹通さないロック [03/11/14 04:40 ID:uv5dJ3X6]
10 GOTO アルカトラズ島;  # ロックへようこそ
20 処理;             
30 逆転無罪;          # 真犯人逮捕⇒釈放

589 名前:nobodyさん mailto:sage [03/11/14 05:44 ID:???]
>>580
>551からの流れでずっとflockの話だったわけだが。


590 名前:nobodyさん mailto:sage [03/11/14 16:05 ID:???]
どっちでも変わらん。
つーか変わってくるとしたらあれだ・・・


掲示板とかのスクリプトで
LOG→HTML随時吐き出し型
じゃなく
LOG=HTMLを表示する型
の場合、Rename型の排他処理は行えない可能性がある。

ということで。
結論から言えば退避ファイル名をhtml→htmとか適当に変えればいいんだろうけど。

591 名前:nobodyさん mailto:sage [03/11/14 17:52 ID:???]
このスレって二つの話題が流れてるんだが。

・flockが使えない環境ではどうしてる?
・ロックの有効性はその方法でなく、ロックを組み込む場所が大事。壊れる原因の大半は誤った使い方によるものなので、ありがちな落とし穴の再検証をしよう。

後者をよく理解してない初心者・中級者が、「flockで壊れた!flock使えねー」とわめいて、前者と後者をまぜこぜにして語って、スレが荒れるのが常。


592 名前:nobodyさん mailto:sage [03/11/14 18:00 ID:???]
それでわめいてるやつは中級とは言えないだろう

593 名前:nobodyさん mailto:sage [03/11/14 18:11 ID:???]
1 nobodyさん 02/06/23 10:18 ID:eY2l+Gw1
 どんな環境でも使えて、軽くて、頑丈なロックを考えようじゃありません

594 名前:nobodyさん mailto:sage [03/11/14 18:32 ID:???]
>>593
そいつは日本語が初心者なんだよw

595 名前:nobodyさん mailto:sage [03/11/14 18:38 ID:???]
たった今594が1を煽りました。



596 名前:nobodyさん mailto:sage [03/11/14 18:55 ID:???]
さあ、>>1よ щ(゚Д゚щ)カモーン!!

597 名前:nobodyさん mailto:sage [03/11/15 08:26 ID:???]
>>590はどうなの?

598 名前:nobodyさん mailto:sage [03/11/16 17:30 ID:???]
横レスすまんが、MySQLでも突っ込んでおけば、lockはぜんぶDBが
やってくれるやん・・・・・・・・ってのはだめなの?
あくまでOSにLockさせないとあかん?

599 名前:nobodyさん mailto:sage [03/11/16 17:34 ID:???]
はいはい、あっち行ってね

600 名前:nobodyさん mailto:sage [03/11/16 21:35 ID:???]
>>598
どうしてそうやって意地でも議論をループさせようとしますか?

601 名前:nobodyさん mailto:sage [03/11/17 02:04 ID:???]
あーごめん。実用の話じゃなくて、神学論争だったのね。
空気よめなかった。すまそ。

602 名前:nobodyさん mailto:sage [03/11/17 02:16 ID:???]
>>601
ていうか DB 使えるならその方がいいし、既に過去レスで全く同じやりとりが何度も出てるし。

603 名前:nobodyさん mailto:sage [03/11/18 14:37 ID:???]
>>601
釣れますか?

604 名前:nobodyさん mailto:sage [03/11/18 17:29 ID:???]
たとえば解析なしのアクセスカウンターにSQL使ってるのを俺は見た事ないな
俺が見た事ないだけかもしれないが

605 名前:nobodyさん mailto:sage [03/11/18 22:15 ID:???]
>>604 大規模サイトだと解析前提だからDBだな。そのほうが楽だし。
個人サイトならカウンタCGIを置くだけでしょ。壊れても問題ないし。

どしてもというなら、セマフォ管理するプロセスを立ち上げといて
それ使うって手もあるのかもしれんがそれならDB使うよ。
OSのファイルロックはアトミックじゃないっす。ソラリスでもそう。
マルチアクセス前提のファイルシステムもあるが、民生用じゃないな。



606 名前:nobodyさん mailto:sage [03/11/21 00:36 ID:???]
>>605
大規模サイトが、アクセスカウンターで解析するか?
ふつー、Webサーバのアクセスログを解析するだろ。

> OSのファイルロックはアトミックじゃないっす。ソラリスでもそう。
お前の使い方がヘボなだけ。

607 名前:nobodyさん mailto:sage [03/11/21 01:22 ID:???]
>>606 ログ解析だけで済めば世の中楽だよなー

608 名前:nobodyさん mailto:sage [03/11/21 01:56 ID:???]
607だけだとあおりみたいだから、いちおー。
確かに大規模サイトにはカウンタはないな。でもユーザーごとにレスポンスを
細かく制御すると、リアルタイムなユーザー管理いるからどうしてもDB。
ログ解析だけだとマーケティングデータしか出てこない。インタラクティブ
リアルタイムにそれ使わないと意味なしな。
静的なサイトでページビューだけでいいならログだけでいいけど、それじゃ
このスレの話題ずれる。
ちなみに俺はDB使わない程度のサイトならservletでロック処理。

609 名前:nobodyさん mailto:sage [03/11/21 02:13 ID:???]
>>608
スレタイを何度も声を出してよく読んでから発言した方が良いのでは?
どう考えてもあなたのレスはどれもこのスレにはお呼びでないと思うのですが?

610 名前:nobodyさん mailto:sage [03/11/21 02:23 ID:???]
>>609 あーすまん。607はあんまり口だすつもりなかったんだが
このスレには、人のことを「ヘボ」としか言わないやつがいて
それがどうもしゃくに障ったんでな。Perlの話しなくてスマソ。

611 名前:nobodyさん mailto:sage [03/11/22 00:21 ID:???]
>>608
Webアプリなら自前でログ持つ、バグ対応すること考えれば当たり前。

「ソラリス」なんて呼ぶ奴が「OSのファイルロックはアトミックじゃないっす」といった時は
使い方間違ってる確率99.9999%

612 名前:nobodyさん mailto:sage [03/11/23 05:00 ID:???]
「そらりす」って読んでた(;´Д`)アヒャ

613 名前:nobodyさん mailto:sage [03/11/23 05:24 ID:???]
>>612
いや、その読み方で合ってるし。

614 名前:nobodyさん mailto:sage [03/11/23 05:41 ID:???]
ところでDBMSで使ってるロック機構ってのは具体的にどんな処理なんでしょうか
単純に思いつくのはキューですが・・・
やっぱデーモンみたいな別プロセスに一括一元管理させるのが安全っちゃ安全ですよね?

615 名前:nobodyさん mailto:sage [03/12/04 07:40 ID:???]
ここは進行遅いですね。

結局、実用に耐えるファイルロックはどれなのか
スクリプト例でまとめて欲しい。おねがいエロイヒト。



616 名前:nobodyさん mailto:sage [03/12/04 11:19 ID:???]
>>10,>>12

617 名前:nobodyさん mailto:sage [03/12/13 19:02 ID:???]
昨日新しいファイルロック法思いついたんだけど寝て起きたら忘れてた

618 名前:nobodyさん mailto:sage [03/12/13 19:54 ID:???]
21世紀のファイルロックなんだろうな?

619 名前:nobodyさん mailto:sage [03/12/15 12:22 ID:???]
WinFS は SQLserver ベースになるそうだから
ファイルロックなんだかDBロックなんだかわからんような
あやしげなロックが提供されるんじゃないのか

620 名前:nobodyさん mailto:sage [03/12/15 19:16 ID:???]
Windowsはレジストリロックが使えます。
排他処理中はキーが書き込まれます。

621 名前:nobodyさん mailto:sage [03/12/19 21:19 ID:???]
今まで、flockが使えないと思ってたんだが、実は使えた!
ってこと無いですか?

622 名前:nobodyさん mailto:sage [03/12/19 23:28 ID:???]
ありませんね
あぁ、知識が足りなくて自分は使えないと?
やっぱりありませんね

623 名前:nobodyさん mailto:sage [03/12/20 02:36 ID:???]
$fp = fopen("test.txt", "a+");
if(!flock($fp, LOCK_EX)) { fclose($fp); echo "ns"; }
echo "ok";
これでいい?

624 名前:nobodyさん mailto:sage [03/12/20 02:38 ID:???]
windows環境で使えないと思ったけど普通に使えることに気が付いてびっくり。
つーかヘルプに書いてあった。

625 名前:nobodyさん [03/12/21 05:04 ID:FyNOPbG5]
きょうび、自作Perlスクリプトを置けるのに、flockが使えないISPなりレンタルサーバなんて、あるの?



626 名前:nobodyさん mailto:sage [03/12/21 16:43 ID:???]
yahoo

627 名前:nobodyさん mailto:sage [04/01/08 00:54 ID:???]
NiftyとかIswebとか使えるけど掛かるかどうかは保証しないとか言ってなかったっけ。
多分既出の話。

628 名前:nobodyさん mailto:sage [04/01/18 18:15 ID:???]
俺も需要がなくなってしまった。
ブックマークから外してしまおうかな。。

629 名前:nobodyさん mailto:sage [04/01/18 19:34 ID:???]
ひととおりネタは出尽くしたからもう外していいと思うよ。

630 名前:nobodyさん mailto:sage [04/01/18 20:27 ID:???]
でも、技術や発想的には応用が利くというかあれなので勿体無い気もする。
いままでありがとう。

631 名前:nobodyさん mailto:sage [04/01/19 01:52 ID:???]
テンプレが見たいなぁ、でも2スレまでいかんだろうなぁ。

632 名前:nobodyさん mailto:sage [04/03/11 20:28 ID:???]
久しぶりに着ますた。dat落ちしてなくてよかた。

ネタが尽きたところで脱線したいんですが、
includeしたりするファイルはflockの必要が無いことを前提としているんですかね。

書き換えや追記などを行うファイルに対し、
includeやrequireしたりするのはナンセンスということで合ってますか?

633 名前:nobodyさん mailto:sage [04/03/12 15:23 ID:???]
それは…
実行するperlスクリプト本体にflockの必要があるか、という話と同じなんじゃないかと

634 名前:nobodyさん mailto:sage [04/03/12 15:32 ID:???]
perl コマンド本体に flock する必要はありますか?

635 名前:nobodyさん mailto:sage [04/03/12 23:11 ID:???]
そういやperlメインのスレですね。スマソ。

PHPにおけるincludeやrequireは単にプログラムの記述されたファイルだけでなく、
HTML、PHP複合型やtxtまで読み込めるわけです。
そういった意味での質問です。



636 名前:nobodyさん mailto:sage [04/03/14 16:47 ID:???]
>>424
歯痛か!

637 名前:nobodyさん mailto:sage [04/03/15 12:04 ID:???]
>>635
php でも perl SSI でも何でもいいんだけど、ロックが重要になるのは基本的に、
ファイルを書き換えるプロセスが複数存在して競合する場合、つまり

A:----->読み込み------->処理-------->書き出し---------------------
B:------------------->読み込み------->処理-------->書き出し-------

のようなケースね。
ロックしないとマジでファイルが壊れたり情報が失われたりする。

これに対して include や require って、
読み込みオンリーで書き換えが有り得ないという前提なので、
上記のような書き込みの競合に参加しないわけで、
そういう意味ではロックの必要性が薄い。
(全く必要性が無いわけじゃないが、ほとんどの場合無視できる)

638 名前:nobodyさん mailto:sage [04/03/15 16:15 ID:???]
共有ロックのLOCK_SHってのがあるんですが、
厳密に言えばロックの必要性があることを示しているんですよね。

639 名前:nobodyさん mailto:sage [04/03/15 16:44 ID:???]
ロック「してもいい」ってだけで、「必要」かというとそうでもないんじゃない?

640 名前:nobodyさん mailto:sage [04/03/15 16:44 ID:???]
ていうか、ロックしてみたところで、書き換えようと思えばできるわけで。

641 名前:nobodyさん mailto:sage [04/03/15 18:08 ID:???]
perl は最初に一括コンパイルするからいいけど、
sh ってスクリプトを一行読み込んで実行してを繰り返すから、
実行途中にスクリプトを書き換えると結構悲惨なことになったりするよな。

642 名前:nobodyさん mailto:sage [04/03/17 13:37 ID:???]
rename使ってファイルロックかけるモジュール作って大ハマリしました。
どうもOSによっては、ファイルシステムの情報取得にタイムラグがあるようで、
renameかけても、OSが保持するファイル情報が即座に更新されないために、
同じ元ファイル名からのrenameが成功してしまうことがありました。

より正確にrename形式でファイルロックをかけるには、
rename後に若干のタイムラグを置いて、rename後のファイルの存在チェックが通れば
ロック成功と考えた方がいいですね。

ちなみに、WinXP+NTFSの組み合わせでそれらの現象がありました。
Linuxだったりすると、こういう現象は出てきますでしょうか?

643 名前:nobodyさん mailto:sage [04/03/17 16:25 ID:???]
んなバカな。
何か間違っている。

644 名前:nobodyさん mailto:sage [04/03/17 18:02 ID:???]
>>642
君が作ったのを晒してくれないか

645 名前:nobodyさん mailto:sage [04/03/18 13:24 ID:???]
>>644
了解です。
ttp://www.mindcompass.sfcgi.com/misc/LOCK.pm.txt



646 名前:nobodyさん mailto:sage [04/03/19 13:53 ID:???]
とりあえずmkdirやrenameを実行した後
仕方なく-dや-eをしなさい。

647 名前:642 mailto:sage [04/03/19 16:28 ID:???]
>>646

その辺(ファイル操作後の存在チェック)は仕方なく実装してます。
同一プロセスで、同じファイルからのrenameコマンドを連続して実行すると、2回目は失敗(これが通常動作)するので、
他プロセスでのファイル操作の結果が反映されるのが遅いらしい。

648 名前:nobodyさん mailto:sage [04/03/19 16:33 ID:???]
-d or mkdirじゃなくてmkdir or !-d

649 名前:nobodyさん [04/03/29 10:00 ID:WLF8C9h8]
ログに「This is a test1.」と10万回書くCGIと「This is a test2.」と10万回書くCGIを二つ同時起動させてみた。
ログにはきちんと20万行書かれてた。

for ($i = 0; $i < 10000; $i++) {
  open (DATA, ">>$file");
  flock (DATA, 2);
  print DATA $str;
  close DATA;
}

こういうのじゃ、そのOSでflockが使用可能かって言う確認にはならないのですか?
ちなみに、環境はWin2KとActivePerl5.6.1で試しましたが。

650 名前:nobodyさん mailto:sage [04/03/29 17:51 ID:???]
>>649
そもそも flock が使用不能なら呼び出した時点で実装されてないって怒られます。
実用的に使用可能か、という意味なら実際に試してみる価値があるかもしれません。
ただし、自分の想定している条件に近くないとあまり意味がないと思います。

651 名前:nobodyさん mailto:sage [04/03/31 01:14 ID:???]
子プロセスを10個forkしてプロセス一つで1000回カウンタを回すスクリプト使ってる。
perlで壊れないロックはflock()だけだった。

652 名前:nobodyさん mailto:sage [04/03/31 05:45 ID:???]
2chのロックはchmod()でやってるらしいね。


653 名前:nobodyさん mailto:sage [04/03/31 07:07 ID:???]
chmod()ではアトミックに書けないように思えるけど、
どんなんだろう。

654 名前:nobodyさん mailto:sage [04/03/31 12:43 ID:???]
chmod() でっていうのは具体的にどうやるの?

655 名前:nobodyさん mailto:sage [04/03/31 12:54 ID:???]
>>654
chmodがどういうものかわからないの?



656 名前:nobodyさん mailto:sage [04/03/31 13:50 ID:???]
時々書き込みしてもインデックスの数字が増えないことがあるが
ロックに失敗してると考えると納得できる話だな > 2chがchmodでロック


657 名前:nobodyさん mailto:sage [04/03/31 15:11 ID:???]
>>655
あなたはわかっているの?

658 名前:nobodyさん mailto:sage [04/03/31 18:13 ID:???]
運用情報のbbs.cgi再開発スレにチラッと載ってる。

659 名前:nobodyさん mailto:sage [04/03/31 21:42 ID:???]
>>658
1000ストップを確実にする方法の議論に見えました。

660 名前:nobodyさん mailto:sage [04/03/31 23:37 ID:???]
なんかflockを使いたくない議論してるよね。

どうせアトミックじゃないのなら
1000の書き込み後にchmodして
1001はクライアントで描画
dat落ち時にはdatに1001を書く、
とか適当にやれば1030くらいで止まるんじゃない?

ダサいけど。


661 名前:nobodyさん mailto:sage [04/04/10 18:40 ID:???]
余分な処理を追加して確実にするより1から書き直したほうがいいんじゃないかな。
運用の奴ら全員で1台のディスプレイを囲んで。
オンラインでの議論なんて無駄無駄。

662 名前:nobodyさん mailto:sage [04/04/16 01:00 ID:???]
filerock

663 名前:nobodyさん mailto:sage [04/04/19 09:45 ID:???]
ロック状態の情報をロックファイルの中に書いておこうと思ったら、
ロックファイルをファイルロックしなければならなくなった。orz

664 名前:nobodyさん mailto:sage [04/04/21 07:50 ID:???]
ロックファイルをファイルロックした情報をロックファイルに書くことはしないんでしょう。

665 名前:nobodyさん mailto:sage [04/04/21 12:24 ID:???]
ロックファイルは存在が全てです。
よくある流行歌の「君がいるだけで」というフレーズが言い当てています。



666 名前:nobodyさん mailto:sage [04/04/23 14:39 ID:???]
たとえばーきみがいるだーけでこころがーろっくされるーことー

667 名前:nobodyさん mailto:sage [04/04/26 01:30 ID:???]
renameするロックはうまく書けば完璧かなと思ったが、外からの干渉に弱い気がする。

668 名前:nobodyさん mailto:sage [04/04/26 01:31 ID:???]
干渉とは?

669 名前:nobodyさん mailto:sage [04/04/27 11:45 ID:???]
>>668
1分でレスしてきた君のためにGTO神書き換えのレスで返そうかと思ったけど、難しいのでやめた。
例えば、/path/to/dataというパスのファイルをファイルロック中は/path/to/data.lockとするぷろぐらみゅがあるとして、
その横で
while(1) {
 open(F, '>/path/to/data');
 close(F);
 open(F, '>/path/to/data.lock');
 close(F);
}
なんてことされたらたまんねぇと。
まあ、適切にパーミッションを設定すれば問題ないのだが、
私はファイルは0666、ディレクトリは0777でも問題ないことを信条としてるのであれかなと。

670 名前:nobodyさん mailto:sage [04/04/27 13:29 ID:???]
>>669
それは、前提が間違ってると思う。
「みなさん、ロックのためのリソースの○○はこうこうこういうふうに使いましょう」
っていう規約をみんながきちんと守ってる、っていう前提で設計しないと。
そんなこと言ったら、「ハカーが○○してきたら」とか「電源落されたら」とか
「スーパーユーザに○○されたら」とか考え出したら何もできないと思う。

671 名前:nobodyさん mailto:sage [04/04/27 13:54 ID:???]
>>670
ハァ?お前は K E N T か?
アップローダーを例に取るとサーバーとユーザーの設定次第で
pc5.2ch.net/test/read.cgi/hp/1076940865/888n
のような事も起こってしまうわけで。
専用のサーバーを使うなら>>670のような設計で構わないと思うけど、
こっちは共用向け、大量配布だからな。そういうわけにはいかんのよ。

672 名前:nobodyさん mailto:sage [04/04/27 14:22 ID:???]
>>671
「 K E N T 」というのは何だか知らないけど、そういうことなら納得です。

# でも >>667 のようなレスからそんな事情は推し測れないよ。

673 名前:nobodyさん mailto:sage [04/04/27 17:59 ID:???]
んー、でもやっぱ正しく安全に使える人が正しく安全に使える鯖で使って下さいで良い気がするんだけど。

初回起動時にランダムな文字列のディレクトリ名やファイル名をスクリプトが自分自身の中に保存して、
それを使い rename()(または mkdir() や open() で作成)してそれをベースとするとか。
ディレクトリ内の一覧表示とかに弱いし総当りもあるし完璧では無いけど。


674 名前:nobodyさん mailto:sage [04/04/27 18:00 ID:???]
と思ったが666なら外からスクリプト自体すら書き換え可能になるのか。
なんてこったい。


675 名前:nobodyさん mailto:sage [04/04/27 20:43 ID:???]
書き替えられるならやってみろ。外からな。



676 名前:nobodyさん mailto:sage [04/04/28 01:00 ID:???]
書き換えられないんなら良いんじゃない。


677 名前:nobodyさん mailto:sage [04/04/28 01:04 ID:???]
>>675
あんたのサイトの書き込み可能は無敵でうらやましいよ

678 名前:nobodyさん mailto:sage [04/04/28 01:51 ID:???]
結局ロックファイルとは直接関係ない話ね。

679 名前:nobodyさん mailto:sage [04/04/28 02:52 ID:???]
みんなさあ、自分の想定する環境とか前提条件とかを明確にしてから
話を始めるようにしようよ。
でないと議論にならないし不毛すぎるよ。

>>667 みたいな話の切り出し方は最低。

680 名前:nobodyさん mailto:sage [04/04/28 16:51 ID:???]
何だ何だ?renameをファイルロックに使ってる魚ばかり網にかかってるじゃないか。

681 名前:nobodyさん mailto:sage [04/04/28 17:14 ID:???]
みんなとほほに操られてるのね

682 名前:nobodyさん mailto:sage [04/04/30 17:27 ID:???]
という事で、bindでロックをかけようとしたが、Windows(Me)上ではいくらでもbind出来てしまうので意味無し。
そんな物を使うぐらいならソケットでプロセス間通信をしてしまう方が楽であると思うが、
Perlなんかでそんな事したらパフォーマンスが(以下略

683 名前:nobodyさん mailto:sage [04/05/19 04:13 ID:???]
すいません。PERLのCGIでtxtファイルを読みこむんですが、読みこみだけの場合でも排他制御は必要でしょうか?

誰かがファイルオープンしているときに別プロセスからファイルを読みこもうとした場合openエラーになっちゃいますよね。
それが嫌な場合は

open(DATA,"< test.txt");
flock(DATA,1);
なんたらかんたら
close(DATA);

みたいにして一人がオープンしている間は別プロセスには待たせればよろしいんでしょうか?
flockの説明を見てみると読みこみだけの時用の番号がなかったので、不安です。自分のPCはwin98なのでflockは使えませんし、
鯖にぶつけ本番はいやだなと思って聞きにきました。


684 名前:nobodyさん mailto:sage [04/05/19 04:50 ID:???]
>>683
みんな読むだけだったら別に排他制御は全然要らんよ。

685 名前:nobodyさん mailto:sage [04/05/19 07:03 ID:???]
683氏に似た質問です。

書き込みの処理が2つ以上同時に行われないと分かっている場合
かつ、一過性の読み込み失敗を許容する場合
書き込みにロックは不要ですか?



686 名前:nobodyさん [04/05/19 09:38 ID:4B5lUTgr]
Dirty readを許すのか、許さないのか?
話はそれからだ


687 名前:nobodyさん mailto:sage [04/05/19 11:10 ID:???]
>>685
「ロックとは何のために必要なのかを教えてくれ」という質問と等価と考えてよいのかな

688 名前:683 mailto:sage [04/05/19 17:00 ID:???]
>>684
いらないんですか。ということはアクセス集中によるオープンエラーは読みこみだけならば
起こらないということですか?

本当は自分でその状況を作り出してテストしてみたいんですけど、動作テストはwin98に入れたhttpdなので
同時アクセスが試せないんですよね。

ファイルオープンするCGIがユーザに色んな項目を記入してもらった次のページなのでエラーが
でちゃうとまた、入力してもらう事になってしまうのでそれはまずいなと思いまして;

689 名前:nobodyさん mailto:sage [04/05/19 18:15 ID:???]
>誰かがファイルオープンしているときに別プロセスからファイルを読みこもうとした場合openエラーになっちゃいますよね。

これがそもそも勘違いだしな。

690 名前:nobodyさん mailto:sage [04/05/19 19:43 ID:???]
>>688
Windows はどうだか知らんけど、
UNIX なら読み出すだけならアクセス集中でオープンエラーなんてないだろ。

つーか、そこまで信頼性高いシステムが必要なら、2ちゃんなんかで質問するより、
もっとちゃんと調べて勉強するか、外注に出した方が良いんじゃないか?

691 名前:683 mailto:sage [04/05/19 23:00 ID:???]
>>689
ありがとうございます。
吐いた制御ってオープンエラーを防ぐんじゃなくて、書きこみが同時に行われてファイルが壊れるのを
防ぐためにあるってことですね。

>>690
ありがとうございました。

692 名前:685 mailto:sage [04/05/20 15:35 ID:???]
>685です。レスが遅れてすみません。
返答ありがとうございます。

>>686
Dirty readとは書き込み中に読み込めるということで、最新でないものを読み込めてしまうということでしょうか。
それは構いませんし、リロードで直る一時的なものであれば読み取りが0バイトでも構いません。

>>687
そういう事になるかも知れません。
言い換えると
書き込み処理が重複しない時、理論的にファイルが壊れるか否かが知りたいのです。

693 名前:nobodyさん mailto:sage [04/05/20 20:28 ID:???]
ファイルを壊す原因は山ほどあるが、
その中でも「書き込み処理が重複する」という原因はよく起こる。
この重複を避けるための道具が、ファイルロック。

ロックは、これさえかければファイルが壊れなくなるという魔法の杖ではない。
ロックは単なるプログラミングの道具に過ぎず、
それも、ファイルを壊さなくするための道具ではなく、
書き込みが重複しているかどうかを識別するだけの道具。
識別した上で書き込みが重複しないようにプログラムを書くのは、プログラマの責任。

逆に、書き込みが重複しないということが100%保証されているなら、
ロックをかけてもかけなくても変わらない。
もちろんその場合でも、書き込み処理重複以外の原因でファイルが壊れることは、いくらでも考えられる。

694 名前:nobodyさん mailto:sage [04/05/20 20:38 ID:???]
書き込みが重複しないということをロック以外の方法で100%に近い精度で
保証する方法なんてあるのか?


695 名前:nobodyさん mailto:sage [04/05/20 21:07 ID:???]
>〜するだけの道具。
まではいい事言ってると思うんだが最後の方になって壊れてるな。



696 名前:nobodyさん mailto:sage [04/05/20 22:40 ID:???]
>>694
単に、書き込みが100%重複しない論理空間を仮定すれば、というだけの話でしょ。
もちろん現実にそんなことはありえないと暗示しているわけで。

697 名前:685 mailto:sage [04/05/21 01:02 ID:???]
皆様回答ありがとうございます。

>>693
という事は書き込みが重複しないなら、
ファイルロックで防げる程度のトラブルは防げるという事ですね。

>>694
書き込み処理を行えるのがパスワードを知っている1人なのです。
パスワードが他人に漏れず、その1人が同時に操作せず、
openしたまま処理が中断することもない・・・
という仮定はありますが。

ファルイロックの基本的な知識さえない私に丁寧な回答ありがとうございました。

698 名前:nobodyさん mailto:sage [04/05/27 13:48 ID:???]
やっと最近になってきっちりしたファイルロックのコード書けるようになった。

けっこうウソ書いてあるサイトが多いのに驚いた。

699 名前:nobodyさん mailto:sage [04/05/27 17:15 ID:???]
>>698
そういうサイトもきっちり書けていると思ってんだろ。
お前と同じように。

700 名前:nobodyさん mailto:sage [04/05/27 20:14 ID:???]
きっちり書けるようになったと自分で思い込むのは勝手だが、他人には言うな。

701 名前:nobodyさん mailto:sage [04/05/27 21:10 ID:???]
どうキッチリ書いたか教えて欲しい

702 名前:nobodyさん mailto:sage [04/05/27 21:08 ID:???]
どう書いたか教えて欲しい

703 名前:nobodyさん mailto:期待上げ [04/05/28 01:38 ID:???]
うん
見せてよ

704 名前:698 mailto:sage [04/05/28 11:16 ID:???]
わたしは秘密主義なんで弟子にも教えることはない。

自分で掴み取れ!  これに尽きるな

705 名前:nobodyさん mailto:sage [04/05/28 15:29 ID:???]
ふっ。これで糞コード蔓延の芽がまた一つ摘み取られた。良かった良かった。



706 名前:nobodyさん mailto:sage [04/05/30 14:43 ID:???]
ファイルロックなんかしなくったって、めっちゃ速く処理してしまえばええやん

707 名前:nobodyさん mailto:sage [04/05/30 14:44 ID:???]
>>706

すげー!! それだっ!

708 名前:nobodyさん mailto:age [04/05/30 18:12 ID:???]
ファイルロックなんかしなくったって、誰もアクセスしなければええやん


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


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


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

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


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


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

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



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

これでOK?

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

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

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

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

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

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

これでいいじゃん

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

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

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

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

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

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



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

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

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

man perlfunc
flock FILEHANDLE,OPERATION
Calls flock(2), or an emulation of it, on FILEHANDLE.Returns true for success,
false on failure. Produces a fatal error if used on a machine that doesn't implement
flock(2), fcntl(2) locking, or lockf(3). flock is Perl's portable file locking interface,
although it locks only entire files, not records.

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

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

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

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

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

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


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

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



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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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



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

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

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

>>765-767
サンクス

過去ログは見るもんだ。

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

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

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

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

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

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

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

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

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



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

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

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


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

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

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

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

>>779
そだね

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

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

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

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

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

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

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


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



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

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

こんな奴


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

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

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


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

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

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

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

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


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

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

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

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

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

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


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

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





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


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

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

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

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

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

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

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

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

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

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

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


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


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



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


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

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

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

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

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

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

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


810 名前:nobodyさん mailto:sage [2005/06/07(火) 20:02:25 ID:???]
>>809
ありがとうございました。理解できました。

811 名前:nobodyさん mailto:sage [2005/06/07(火) 20:15:05 ID:???]
>>809
前から疑問に思っていたんだが、
> 9番目
0から始まっているから、この場合10番目なのはみんな知っていると思うけど、9番目といってもいいのかな?
どういう言い方が正しいのか教えて。

812 名前:nobodyさん mailto:sage [2005/06/07(火) 20:59:09 ID:???]
9番目の要素(ninth element)、0番目の要素(zeroth element)でいいと思うけど、
9番の要素、0番の要素の方がすっきりする?

813 名前:nobodyさん mailto:sage [2005/06/07(火) 22:14:04 ID:???]
質問です。かの有名なperlメモで以下のように書きました。
my_flockのサブルーチンの中で、戻り値を「\%lfh」のようにリファレンスで返す理由がわかりません。どなたか教えてください

$lfh = my_flock() or die 'Busy!';
open(FILE,"+<$logfile");
chop($count = <FILE>);
$count++;
seek(FILE,0,0);
print FILE "$count\n";
close(FILE);
my_funlock($lfh);

sub my_flock {
  my %lfh = (dir => './lockdir/', basename => 'lockfile', timeout => 60, trytime => 5, @_);
  $lfh{path} = $lfh{dir} . $lfh{basename};
  for (my $i = 0; $i < $lfh{trytime}; $i++, sleep 1) {
    return \%lfh if (rename($lfh{path}, $lfh{current} = $lfh{path} . time));    
  }    # ■↑戻り値がなぜ\%lfh?
  opendir(LOCKDIR, $lfh{dir});
  my @filelist = readdir(LOCKDIR);
  closedir(LOCKDIR);
  foreach (@filelist) {
    if (/^$lfh{basename}(\d+)/) {
      return \%lfh if (time - $1 > $lfh{timeout} and rename($lfh{dir} . $_, $lfh{current} = $lfh{path} . time));
      last;    # ■↑戻り値がなぜ\%lfh?
    }
  }
  undef;
}
sub my_funlock {
  rename($_[0]->{current}, $_[0]->{path});
}

814 名前:nobodyさん mailto:sage [2005/06/07(火) 22:35:39 ID:???]
my_funlockで$lfh{current}と$lfh{path}の2つの値を使いたい
ので、この作者は(他にもいろいろ方法は考えられるがたまたま)
その2つの値が入ったハッシュのリファレンスを返すという方法
を選択した、というところだろうか。


815 名前:nobodyさん [2005/06/08(水) 00:31:21 ID:HPDd28CP]
>>813
戻り値無しで
if (rename($lfh{path}, $lfh{current} = $lfh{path} . time));
return;
とやっても同じ 



816 名前:nobodyさん mailto:sage [2005/06/08(水) 12:02:28 ID:???]
ここのカウンター広告ないし最高だよ。
www.eucaly.net/
www.eucaly.net/
www.eucaly.net/
www.eucaly.net/
www.eucaly.net/
www.eucaly.net/
www.eucaly.net/
www.eucaly.net/
www.eucaly.net/
www.eucaly.net/

817 名前:nobodyさん [2005/06/08(水) 12:12:58 ID:???]
>>815
違うような・・・

818 名前:nobodyさん [2005/06/08(水) 13:04:42 ID:???]
>>814
お答えありがとうございました。
何かの弾みで「./lockdir/lockfile」の名前が変わってしまうことってありますか?
その場合ってエラーを返すしかないのでしょうか?

819 名前:nobodyさん [2005/07/02(土) 23:42:28 ID:MoVRWRYG]
PHPで掲示板のログファイルを読み込んで配列に入れるのに
file()を使ってたんですが、これはロックされてないですよね?

fopenしてflockに変更した方がいいですか?


820 名前:nobodyさん mailto:sage [2005/07/03(日) 19:24:42 ID:???]
>>819
スレタイを声を出して100回読んでみなさい。

821 名前:nobodyさん mailto:sage [2005/07/06(水) 15:38:22 ID:???]
ファイルロック(排他処理)について語ろう

822 名前:nobodyさん mailto:sage [2005/07/06(水) 20:01:43 ID:???]
ファイルロック(排他処理)について語ろう

823 名前:nobodyさん mailto:sage [2005/07/07(木) 11:51:39 ID:???]
file関数は読み込みしかしないからロックも何もない

824 名前:nobodyさん [2005/07/11(月) 12:06:06 ID:LOhIsGf7]
open LOCK, ">hogehoge";
flock LOCK, 2;
処理;


↑のようにLOCKをしっぱなしで、closeをしないとどうなりますか?
一連の処理が終了したら、LOCKは自動解除されるんでしょうか?

825 名前:nobodyさん mailto:sage [2005/07/11(月) 15:42:12 ID:???]
PGが終了すればファイルハンドルは閉じられる。



826 名前:nobodyさん mailto:sage [2005/07/11(月) 16:23:12 ID:???]
ファイルロック難しいお

827 名前:nobodyさん [2005/09/29(木) 15:27:47 ID:6eWvRT5D]
エクセルでテンポラリがリネームに失敗するのは排他処理に失敗したこと
による可能性はありますか?

828 名前:nobodyさん mailto:sage [2005/09/30(金) 17:50:44 ID:???]
ロック用ファイル1に時刻書き込み

ロックファイル1に時刻がなかったらロック用ファイル2を開いてロック(あったら待機)

一時ファイルに書き込み

読み込み用ファイルに内容をコピー

ロック用ファイル2を閉じる

ロック用ファイル1を空にする

最強、破損なし。
時刻は異常があった時に現在時刻と比較して無限待機させない用。

829 名前:nobodyさん mailto:sage [2005/09/30(金) 18:31:16 ID:???]
>>828
「1に時刻書き込み」してから「1に時刻がなかったら」をチェックするのは変じゃない?

830 名前:nobodyさん mailto:sage [2005/09/30(金) 21:17:53 ID:???]
それよりロック用ファイル1のロックはどうするんだ

831 名前:nobodyさん mailto:sage [2005/09/30(金) 21:28:52 ID:???]
「破損なし」なのは「ロック用ファイル2」をロックしてるからだけで、
本質的には目新しいアイディアがひとつも無いどころか
単に無駄なことしてるだけに思えるのは気のせいですかそうですか。

832 名前:nobodyさん [2005/10/09(日) 23:29:44 ID:nlo5+ZWx BE:169416465-##]
>>828
はなしにならんな。 あきれたよ。もう実家に帰る!

833 名前:nobodyさん [2005/12/08(木) 21:09:42 ID:pHM0ErCM]
perlを始めて3ヶ月位ですが、ファイルロックに
ついて自分なりに色々と試行錯誤した結果、以下の
ようなルーチンを作りました。
flockが使える事が前提ですが、何か欠点や改良点が
あれば指摘して頂けるとありがたいです。

filelock.pl
package filelock;
our %_lock;
sub END {
 foreach my $file ( keys %_lock ) {
  close( $_lock{$file}{'handle'} );
  unlink( $_lock{$file}{'name'} );
  if( $_lock{$file}{'tmp'} ) { rename( $_lock{$file}{'tmp'}, $file ); }
} }
sub readOpen {
 my ( $file ) = @_;
 my ( $handle );
 _append( $file );
 if( !open( $handle, "<$file" )) { return undef; }
 return $handle;
}


834 名前:nobodyさん [2005/12/08(木) 21:10:10 ID:pHM0ErCM]
sub writeOpen {
 my ( $file ) = @_;
 my ( $handle );
 _append( $file );
 if( !$_lock{$file}{'tmp'} ) {
  $_lock{$file}{'tmp'} = $file;
  $_lock{$file}{'tmp'} =~ s/(.*)\.(.*)/$1\.tmp/;
 }
 if( !open( $handle, ">$_lock{$file}{'tmp'}" )) { return undef; }
 return $handle;
}
sub _append {
 my ( $file ) = @_;
 if( $_lock{$file} ) { return; }
 $_lock{$file}{'name'} = $file;
 $_lock{$file}{'name'} =~ s/(.*)\.(.*)/$1\.lck/;
 open( $_lock{$file}{'handle'}, ">$_lock{$file}{'name'}" );
 my $count = 0;
 while( !flock( $_lock{$file}{'handle'}, 2 )) {
  sleep( 1 );
  if( $count++ > 10 ) {
   print '[error]Sarver Busy.';
   exit;
} } }
1;

835 名前:nobodyさん [2005/12/08(木) 21:14:40 ID:pHM0ErCM]
ちなみに、使い方は下記のように使います。

require './filelock.pl';
$file = filelock::readOpen( "count.dat" );
$data = <$file>;
close( $file );
$data = $data + 1;
$file = filelock::writeOpen( "count.dat" );
print $file $data;
close( $file );




836 名前:nobodyさん mailto:sage [2005/12/08(木) 23:57:56 ID:???]
普通にflock使えばいいのにと野暮な突っ込み。

斜め読みしただけだから適当に。
ノンブロッキングロックじゃないと、whileループ内は無駄。
test.txtとtest.datが同じファイルと見なされる。
ロックを解除してるところがない?
サンプルスクリプトはロックが壊れる典型。

837 名前:nobodyさん mailto:sage [2005/12/09(金) 00:42:03 ID:???]
>>836
解答ありがとうございます。

>ノンブロッキングロックじゃないと、whileループ内は無駄。
そうですね。2(LOCK_EX)ではなくて2|4(LOCK_EX|LOCK_NB)
とすればokですね。

>test.txtとtest.datが同じファイルと見なされる。
まぁ、これは仕様という事で…(^^;

>ロックを解除してるところがない?
ENDの中のcloseで解除しているつもりなのですが
closeではロックは自動的解除されないのでしょうか?

>サンプルスクリプトはロックが壊れる典型。
どういう場合にロックが壊れるのでしょうか?
ご掲示頂けるとありがたいです。


838 名前:nobodyさん mailto:sage [2005/12/09(金) 03:18:54 ID:???]
>>837
ENDブロックは、スクリプトの処理の最後で処理されるので、
自動でアンロックさせたいのなら、返すファイルハンドルをオブジェクトにして、
DESTROYブロックを使ってアンロックさせる。
ついでにcloseも再定義。

ロックについては
web.archive.org/web/20040216083853/www98.sakura.ne.jp/~jun/perl/flock.html

839 名前:833 mailto:sage [2005/12/09(金) 03:47:51 ID:???]
>>838
意図的にENDブロックに書いています。オブジェクトを作ってDEST
ROYブロックでアンロックする方法も考えたのですが…

hoge01.pl
read "data01.dat"
read "data02.dat"
-> hoge02.pl
write"data01.dat"
write"data02.dat"
-> hoge03.pl
write"data03.dat"
end

↑こんな感じで読み書きしたい場合、ファイルアクセスする可能
性のある所全てでオブジェクトを保持していないといけないので、
意図的にグローバルに情報を置いて、スクリプトの終わりでEND
ブロック内で一括に処理したのです。

ところで、"closeも再定義"って何ですか?

840 名前:nobodyさん mailto:sage [2005/12/09(金) 12:08:16 ID:???]
closeの再定義と言ったのは、closeのオーバーライドすること。
closeでロックの開放をするのなら、自前のcloseを書いて、
そこで必要な操作を行ってから、CORE::closeを呼び出すという感じで。

と、考えていたのだけど、
どうも考え方が違ってたっぽいか。

841 名前:833 mailto:sage [2005/12/09(金) 15:36:13 ID:???]
ちょっと、皆さんが勘違いしているっぽいので詳細を書きます。

readOpen
  戻り値 : ファイルハンドル
  機能 : 指定されたファイルの拡張子をlckに変えたファイルを
  flockして指定されたファイルをオープン。flockが10秒以上で
  きない場合は異常終了。

writeOpen
  戻り値 : ファイルハンドル
  機能 : 指定されたファイルの拡張子をlckに変えたファイルを
  flockして指定されたファイルの拡張子をtmpに変えたファイル
  をオープン。flockが10秒以上できない場合は異常終了。

END
  機能 : readOpen,writeOpenでロックされたファイル(*.lck)を
  close。writeOpenで返したのファイル(ハンドル)を元の名前に
  リネーム。(*.tmp→*.元の拡張子)

引き続き、何か欠点や改良点があれば指摘して頂けるとありがたいです。

842 名前:nobodyさん mailto:sage [2005/12/09(金) 16:10:37 ID:???]
>>841
致命的にやばい点:

ENDの中でlockファイルをcloseした時点でflockは外れるので、
その後のunlockとtmpファイルのrenameがロックなしで行われる。

改善した方がいい点:

readしかしない場合でも排他的にロックしてしまうのは嬉しくない。

ENDが実行されるまでロック状態が持続するので、ロックの保持
期間が長くなりそうだしdaemon的プログラムだとどうすんの?

tmpの書き込み中に問題がでて取りやめたいときの手段がない
(やろうと思えば%filelock::_lockいじる手はあるが...)

リトライ回数が尽きたときにいきなりexitするのは汎用性がない。
せめてdieにしとけばevalでトラップする余地があるのだが。



843 名前:833 mailto:sage [2005/12/09(金) 17:26:00 ID:???]
>unlockとtmpファイルのrenameがロックなしで行われる。
そうですね。renameは一番最初にやるとして、その後にunlink→
closeでしょうか?closeの前にunlinkってできるのでしょうか?

>readしかしない場合でも排他的にロックしてしまうのは嬉しくない。
ここでは省略しましたが、
 unlockFile( $filename )
   機能 : 強制的に指定されたファイルのロックを解除する。
というルーチンがあります。自分は、デフォルトは「最後まで排
他的にロック」。オプションで「指定したファイルのロックを解除」
っていう感じで考えてます。この方が間違いが無いと思うので。

>tmpの書き込み中に問題がでて取りやめたいときの手段
そうですね。これは、abortLockみたいなルーチンを作って最後の
ENDブロックの中でrenameしないようにすれば良いんじゃないで
しょうか?

>リトライ回数が尽きたときにいきなりexitするのは汎用性がない。
if( $count++ > 10 ) { die "flock busy" }
こんな感じで良いですかね?

まだまだ経験が浅いので、先輩諸氏からの助言は為になります。
他にも欠点や改良点があれば指摘して頂けるとありがたいです。


844 名前:nobodyさん mailto:sage [2005/12/09(金) 21:41:26 ID:???]
>>843
「ファイルを変更する(可能性がある)場合に排他ロック、読むだけで済む場合は共有ロック」
というのはひとつのセオリーだけれども、なぜそれがセオリーなのか、そもそもファイルロックとは何なのかを調べるなどして考えてみましょう。

>readしかしない場合でも排他的にロックしてしまうのは嬉しくない。

という >>842 の指摘にはまったく同意で、デメリットはいくらも思いつくけれど残念ながらメリットはひとつも思い浮かびません。
見境なしに排他ロックというのではファイルロックの魅力が半減以下です。

またファイルを利用している、いないに関わらずロックを離さないというのはお行儀が今ひとつ。各プロセスの実行時間が充分に短く、また起動頻度が比較的低ければ問題は出づらいでしょうけれど、少なくとも誰かに勧めることができるやり方じゃないですね。


845 名前:833 mailto:sage [2005/12/09(金) 22:03:55 ID:???]
色々な意見を参考に作り直してみました。
前作にあったバグ(read→write→readした時に*.tmpファイルから
読まない)も修正しています。

open
  パラメータ:通常のopenと一緒だけど使えるのは'>'と'<'のみ。
  戻り値:ファイルハンドル
  機能:指定されたファイルの拡張子をlckに変えたファイルを
  flockして指定されたファイルをオープン。flockが10秒以上で
  きない場合は異常終了。
close
  パラメータ:openで得られたファイルハンドルとオプション。
  機能 : 指定されたファイルハンドルを閉じます。オプションで
  1を指定するとロックを解除して書き込みがある場合はリネーム
  して反映。2を指定するとロックを解除して書き込みがある場合
  は*.tmpファイルを削除(つまり書き込みをキャンセル)
END
  機能 : *.lckをclose&unlink。*.tmpがある場合は、元のファイ
  ル名にリネーム。

package filelock;
our %_FileList;
our %_HandleList;
sub END {
 foreach my $filename ( keys %_FileList ) {
  if( $_FileList{$filename}{'temp'} ) { rename( $_FileList{$filename}{'temp'}, $filename ) }
  unlink( $_FileList{$filename}{'lock'} );
  close( $_FileList{$filename}{'handle'} );
} }



846 名前:833 mailto:sage [2005/12/09(金) 22:05:50 ID:???]
sub open {
 my ( $filename ) = @_;
 my ( $handle, $tempfile, $mode );
 if( $filename =~ /^>.*/ ) { $filename =~ s/^>(.*)/$1/; $mode = 2 }
 elsif( $filename =~ /^<.*/ ) { $filename =~ s/^<(.*)/$1/; $mode = 1 }
 else { return undef; }
 if( $mode == 1 && !( -e $filename )) { return undef }
 if( !$_FileList{$filename} ) {
  my $lockname = $filename;
  $lockname =~ s/(.*)\.(.*)/$1\.lck/;
  open( $handle, ">$lockname" );
  my $count = 0;
  while( !flock( $handle, ( 2 | 4 ))) {
   sleep( 1 );
   if( $count++ > 10 ) { die "flock busy" }
  }
  $_FileList{$filename}{'lock'} = $lockname;
  $_FileList{$filename}{'handle'} = $handle;
 }
 $tempfile = $filename;
 if( $mode == 1 ) {
  if( $_FileList{$filename}{'temp'} ) { $tempfile = $_FileList{$filename}{'temp'} }
  if( !open( $handle, "<$tempfile" )) { die "file open error(read)" }
 } elsif( $mode == 2 ) {
  if( $_FileList{$filename}{'temp'} ) { $tempfile = $_FileList{$filename}{'temp'} }
  else {
   $tempfile =~ s/(.*)\.(.*)/$1\.tmp/;
   $_FileList{$filename}{'temp'} = $tempfile;
  }
  if( !open( $handle, ">$tempfile" )) { die "file open error(write)" }

847 名前:833 mailto:sage [2005/12/09(金) 22:07:31 ID:???]
 }
 $_HandleList{$handle} = $filename;
 return $handle;
}
sub close {
 my ( $handle, $option ) = @_;
 if( $option && ( $option == 1 || $option == 2 )) {
  close( $handle );
  my $filename = $_HandleList{$handle};
  if( $_FileList{$filename}{'temp'} && $option == 1 ) { rename( $_FileList{$filename}{'temp'}, $filename ) }
  elsif( $_FileList{$filename}{'temp'} && $option == 2 ) { unlink( $_FileList{$filename}{'temp'} ) }
  unlink( $_FileList{$filename}{'lock'} );
  close( $_FileList{$filename}{'handle'} );
  delete( $_FileList{$filename} );
  delete( $_HandleList{$handle} );
 } else {
  close( $handle );
  delete( $_HandleList{$handle} );
} }
1;

例:
require './filelock.pl';
$file = filelock::open( "<count.dat" );
$data = <$file>;
filelock::close( $file );
$data = $data + 1;
$file = filelock::open( ">count.dat" );
print $file $data;
filelock::close( $file, 1 );

848 名前:nobodyさん mailto:sage [2005/12/11(日) 11:36:06 ID:???]
わぁ。。 もっとシンプルなやり方あるのにぃ〜

849 名前:nobodyさん mailto:sage [2005/12/11(日) 15:20:09 ID:???]
my ( $filename ) = @_; まで読んだ。

850 名前:nobodyさん mailto:sage [2005/12/11(日) 23:38:47 ID:???]
どうせ>>848は、「じゃあ、そのやり方を書いてみろ」
と言ったところで、その案に穴があるか、書けないか
どっちかだろ?…という訳で、とりあえず

>>848
じ ゃ あ 、 そ の や り 方 を 書 い て み ろ

851 名前:nobodyさん mailto:sage [2005/12/12(月) 10:42:51 ID:???]
unlinkしてからcloseもだめです。

(Aが正常にロックを取得した状態から)
B: open
A: unlink
C: open
A: close
B: flock(成功する)
C: flock(成功する)

flockを使うときはロックファイルは一度作ったら消さないのが
わかりやすい。

どうしても削除したければ、その操作をするためのロックを
別にするとかややこしいことをする羽目になる。


852 名前:nobodyさん mailto:sage [2005/12/12(月) 21:10:57 ID:???]
>>851
ん?Aがロックした状態なんだよね?
B: open -> Aがロック中なので開けない
A: unlink -> 自分がロック中なので削除できる
C: open -> Aがロック中なので開けない
A: close -> 自分のロックを外す
B: flock(成功する) -> Bがロック
C: flock(成功する) -> Bがロック中なので開けない…のでわ?

853 名前:nobodyさん mailto:sage [2005/12/12(月) 21:21:39 ID:???]
>>852
flockによるロック中でもopenはできるのでBはopenできるし、
Aが削除した後はそのファイルは存在しないんだから、
Cは新たに同じ名前の別のファイルを作ってopenできる。
そしてことのきBとCがそれぞれロックファイルだと思って
開いたファイルは実は別のものになるというのが問題
なのです。


854 名前:nobodyさん mailto:sage [2005/12/12(月) 22:29:46 ID:???]
>>853
削除したらロックが外れるのは初耳だ。
つちの環境だと
open -> unlink -> sleep(10) -> close
で、sleep(10)の間はflockできないんだが…。

>flockによるロック中でもopenはできるので
>>833(845)のソースではopenする前にflockの
確認してると思うけど、そりゃ、perlが内部で
flock処理に入ったタイミングで他プロセスが
openしたらできるかもしれないが、そしたら
flock自体意味無しって事になるぞ?

855 名前:nobodyさん mailto:sage [2005/12/12(月) 22:33:12 ID:???]
正:うちの環境
誤:つちの環境

とりあえず>>853>>833(845)のソースを実際に実行して
穴があってから発言したら?
"俺予想"だけで発言しても意味無いよ。



856 名前:nobodyさん mailto:sage [2005/12/12(月) 22:39:11 ID:???]
>>854
削除したらロックがはずれるのではなくて、同じ名前のロック
ファイルを別に作れてしまう。sleep(10)の間にロックファイルを
openしようとしたら存在しないので新しいファイルが作られてしまう
から、当然flockもできるでしょ。

> openする前にflockの 確認してると思うけど
flockはopenした後のファイルハンドルに対する操作
だから、openしてないのにできるわけないよ。ロックファイルの
openと操作したいファイルのopenを混同してない?


857 名前:nobodyさん mailto:sage [2005/12/13(火) 00:46:00 ID:???]
package filelock;

sub open

sub close
見ただけで、他のところ見る気なくすね。

858 名前:nobodyさん mailto:sage [2005/12/13(火) 01:24:36 ID:???]
>>856
なるほどね。
しかし、open→flockの間にflockされる問題を回避する事なんてできるの?

>>857
スレタイを百万回読んでスレの趣旨が名前なんて関係無いという事に気付け。

859 名前:nobodyさん mailto:sage [2005/12/13(火) 23:21:49 ID:???]
> しかし、open→flockの間にflockされる問題を回避する事なんてできるの?
げらげら
sub openとか、package filelockなんか平気で使ってる奴はやっぱりレベル低いねえ。

860 名前:nobodyさん mailto:sage [2005/12/14(水) 00:31:33 ID:???]
せっかくのflockが泣いてるぜ。。

861 名前:nobodyさん mailto:sage [2005/12/14(水) 05:19:12 ID:???]
>>859
漏れは>>858だけど>>833じゃないんだけどなぁ。
なんか、このスレは文句ばっかりで意欲的に書き込んでる>>833
援護しただけなんだけど、文句言うだけがスレの趣旨みたいね。

スレ汚しスマソ。

862 名前:nobodyさん mailto:sage [2005/12/14(水) 07:59:40 ID:???]
> しかし、open→flockの間にflockされる問題を回避する事なんてできるの?
じゃなくて、その問題が起きないようにしないとロックになってないわけよ。
一番簡単なのは851で指摘してる通りロックファイルを削除しないこと。

ただの文句としか言えない書き込みがあるのも確かだが、まじめに
バグを指摘してるのにひとくくりにして文句とか言われてもなぁ。


863 名前:833 mailto:sage [2005/12/14(水) 10:14:13 ID:???]
>>848-862
色々とご指摘ありがとうございます。ロックファイルをunlinkす
ると、close前にロックファイルがopen(作成)できてしまう問題を
回避する為にunlinkしない事にしました。
しかし、それだと*.lckが沢山できてしまうので、filelockディレ
クトリを作ってその中に作る事にしました。同様に書き込み用の
テンポラリファイルもその中に作るようにしたので、今までの
*.lckや*.tmpファイル名が使えなかったり拡張子だけが違うファ
イルが扱えない問題も無くなりました。
その代わり、各ディレクトリにfilelockという名前のディレクト
リができます。以下にソースを晒します。

sub open {
  my ( $filename ) = @_;
  my ( $handle, $mode );
  if( $filename =~ /^>.*/ ) { $filename =~ s/^>(.*)/$1/; $mode = 2 }
  elsif( $filename =~ /^<.*/ ) { $filename =~ s/^<(.*)/$1/; $mode = 1 }
  else { return undef; }
  if( $mode == 1 && !( -e $filename )) { return undef; }
  $filename =~ /(.*)(\\|\/)(.*)/;
  if(! -d "$1$2filelock") {
    mkdir("$1$2filelock", 0755);
    mkdir("$1$2filelock/tmp", 0755);
  }
  if( !$_FileList{$filename} ) {
    $filename =~ /(.*)(\\|\/)(.*)/;
    my $lockfile = $3 eq '' ? "$1$2filelock/$filename" : "$1$2filelock/$3";
    if( !open( $handle, ">$lockfile" )) { die "file open error" }
    my $count = 0;
    while( !flock( $handle, ( 2 | 4 ))) {

864 名前:833 mailto:sage [2005/12/14(水) 10:14:38 ID:???]
      sleep( 1 );
      if( $count++ > 10 ) { die "flock busy($lockfile)" }
    }
    $_FileList{$filename}{'lock'} = $lockfile;
    $_FileList{$filename}{'handle'} = $handle;
  }
  if( $mode == 1 ) {
    my $openfile = $filename;
    if( $_FileList{$filename}{'temp'} ) { $openfile = $_FileList{$filename}{'temp'}; }
    if( !open( $handle, "<$openfile" )) { die "file open error" }
    $_HandleList{$handle} = $filename;
    return $handle;
  } elsif( $mode == 2 ) {
    my $openfile = $filename;
    if( $_FileList{$filename}{'temp'} ) { $openfile = $_FileList{$filename}{'temp'};
    } else {
      $filename =~ /(.*)(\\|\/)(.*)/;
      my $tempfile = $3 eq '' ? "$1$2filelock/tmp/$filename" : "$1$2filelock/tmp/$3";
      $_FileList{$filename}{'temp'} = $tempfile;
    }
    if( !open( $handle, ">$openfile" )) { die "file open error" }
    $_HandleList{$handle} = $filename;
    return $handle;
  }
  return undef;
}

引き続き、欠点や改良点があれば指摘して頂けるとありがたいです。

865 名前:nobodyさん mailto:sage [2005/12/14(水) 14:36:11 ID:???]
というか、排他制御の何たるかが理解できてないのに、
いくらコード書いたって無駄だろ。
少なくとも誰も使わんと思うが。



866 名前:nobodyさん mailto:sage [2005/12/14(水) 20:09:27 ID:???]
文句しか書かない厨は、華麗にスルーでおながいすまつ。

867 名前:nobodyさん mailto:sage [2005/12/15(木) 00:56:13 ID:???]
文句にしか聞こえない馬鹿は、似非ロックをバグと一緒に作っていなさい。

868 名前:nobodyさん mailto:sage [2005/12/15(木) 06:51:32 ID:???]
>>867
すげー苦しい言い訳だ。>>865が文句に見えないなら
小学校の国語からやりなおした方が良いよマジで。
とりあえず漏れが>>865が文句だと思う具体的な根拠は…
・どこが問題なのか具体的な事が書かれていない
・自分の中の意見を「誰も」と書くことで皆と同じだと思い込んでる
・文章が全体的に罵倒した口調。何かイヤな事でもあったの?(w

>>833
最初に比べると随分マシになったと思うよ。
具体案を何も提示しないアホな煽りに構わず頑張って欲しい。


869 名前:nobodyさん mailto:sage [2005/12/15(木) 07:53:45 ID:???]
>>865-367
2ちゃんねるですからねー
煽り煽られはあたりまえ
荒らしはスルーが基本ですよ

870 名前:nobodyさん mailto:sage [2005/12/15(木) 09:24:29 ID:???]
なんてルーチン内でロック失敗してundef返すのとdieで処理を完結させるのが
混在してるの?

871 名前:nobodyさん mailto:sage [2005/12/15(木) 09:53:36 ID:???]
もちっとプログラミングができるようになってからやろうな。
まだ君には早いよ。

872 名前:nobodyさん mailto:sage [2005/12/15(木) 10:22:47 ID:???]
みんなに使って欲しい、というんではなく、Perlの勉強として
やってんでしょうから、大目に見てやんなって。


873 名前:nobodyさん mailto:sage [2005/12/15(木) 11:10:51 ID:???]
perlの勉強の前に排他制御の勉強しないから似非ロックが量産される。

874 名前:nobodyさん mailto:sage [2005/12/15(木) 12:01:28 ID:???]
>>870
ファイルが無かったりオプションの指定が違ったりだとundefしてて、
ファイルに書き込めなかったりロックできなかったりするとdieしてる。
たぶん、見た感じだとundefは想定内(?)のエラー。dieは想定外(?)
のエラーって感じじゃないのかな?


875 名前:nobodyさん mailto:sage [2005/12/15(木) 12:09:03 ID:???]
漏れは>>883のソースで十分に排他制御できてると思うんだけど
とりあえず>>865>>873が言う「排他制御」と>>833のソースの
排他制御は何が違うのか具体的に書いてくれまいか?



876 名前:nobodyさん mailto:sage [2005/12/15(木) 22:24:03 ID:???]
>>883
頑張れ。

877 名前:nobodyさん mailto:sage [2005/12/16(金) 01:11:58 ID:???]
>>875
「これだから排他制御を理解してない香具師は…」って
言いたいだけなんだよ。そっとしといれやれ(w

878 名前:nobodyさん mailto:sage [2005/12/16(金) 01:57:10 ID:???]
>>833
排他的なロックに対しては、それで良いと思う。テンポラリファイルを作って書き込み
エラーにも対応してるし。しかし、それで全てOKという訳では無い。
例えばAというファイルをプロセス1〜10が同時に読み込み処理が行われて書き込み処理が
無い場合を考えてみよう。プロセス1が読み込み終わるまでプロセス2は読み込み処理を
行えない。読み込み処理だけならば排他的なロックは必要無いのに。
まぁ、それをわかっていて>>833が何でも排他的なロックを使っているなら良いのだが…

879 名前:nobodyさん mailto:sage [2005/12/16(金) 03:04:17 ID:???]
こうだろ?

× 読み込み処理だけならば排他的なロックは必要無いのに。
○ 読み込み処理だけならば排他的なロックは必要無いケースもあるのに。



880 名前:nobodyさん [2005/12/16(金) 05:43:26 ID:nqW99XKP]
ソースは他のところに上げて、そのURLを書いてください。
すごく邪魔

881 名前:nobodyさん [2005/12/16(金) 05:44:47 ID:nqW99XKP]
なにがなんでも「データを取得できずに空ページを表示」というのを防ぎたいんじゃないのかなぁ?
って思ったり。


882 名前:nobodyさん mailto:sage [2005/12/16(金) 12:06:00 ID:???]
書き込みオープンだけを行うと、一回目と二回目で違うファイルを開かないか。

883 名前:nobodyさん mailto:sage [2005/12/17(土) 01:28:51 ID:???]
>>882
開かないと思うけど…。それに追記に対応してないみたいだから
1回目も2回目も「新規ファイル作成」扱いになるんだよね?

884 名前:nobodyさん mailto:sage [2005/12/17(土) 02:42:54 ID:???]
>>864で、書き込みファイルの指定が
> my $openfile = $filename;
> if( $_FileList{$filename}{'temp'} ) { $openfile = $_FileList{$filename}{'temp'};
てなことになってる。

「書き込みを行って読み込み」を行うとすると、
まず書き込みで$filenameに書き込まれて、
読み込みで$_FileList{$filename}{'temp'}が読まれることになると思われる。

885 名前:nobodyさん mailto:sage [2006/01/08(日) 16:25:04 ID:???]
test



886 名前:nobodyさん mailto:sage [2006/01/11(水) 15:20:26 ID:???]
で、結局どうなったの?

887 名前:nobodyさん mailto:sage [2006/01/11(水) 18:09:12 ID:???]
      ______       ______
     r' ,v^v^v^v^v^il    /          ヽ
     l / jニニコ iニニ!.   /  ジ  き  ぼ   l
    i~^'  fエ:エi  fエエ)Fi  !   ャ  れ  く    l
    ヽr      >   V  !   イ  い  は   l
     l   !ー―‐r  l <.   ア  な       l
 __,.r-‐人   `ー―'  ノ_ ヽ  ン         /
ノ   ! !  ゙ー‐-- ̄--‐'"ハ ~^i \_       _ノ
 ヽ ! ヽ、_     _.ノ  i  \    ̄ ̄ ̄ ̄
ヾV /              ! /.入

888 名前:nobodyさん mailto:sage [2006/01/23(月) 18:41:58 ID:???]
renameでロックをしてみました。どうでしょうか?
  $nowsec=time;
  $lockname="./lock/lock_".$nowsec;
  $basename="./lock/lock";
  while (1){
  if (rename $basename,$lockname){&process()};
  $n++;
  if ($n>=5){&error()};
  sleep 1;
  };
  opendir (LOCKDIR,lock);
  @filelist=readdir(LOCKDIR);
  closedir(LOCKDIR);
  foreach $filename (@filelist) {
  if ($filename=~/_/) {
  ($dest,$locktime)=split(/_/,$filename,2);
    unless ($locktime==$nowsec){
    $timedif=$nowsec-$locktime;
      if ($timedif>=5){
      rename $filename,$lockname;
      };
    };
  };
sub process{
  &backname()
}
sub backname{
  rename $lockname,$filename;
}

889 名前:nobodyさん [2006/01/28(土) 10:06:37 ID:JFqaWvHV]
ファイルロックと言うのは、
先にファイルを開いておいて、それからロックするものですか?

オープン前に排他制御かけるのは無駄ですか?

890 名前:nobodyさん mailto:sage [2006/01/28(土) 12:03:17 ID:???]
有効。

891 名前:nobodyさん mailto:sage [2006/01/29(日) 01:06:29 ID:???]
>>889
flockだとファイルハンドルが必要だから先にオープンしないといけない。

892 名前:889 [2006/01/29(日) 07:30:55 ID:rUKuWvJe]
@dataにデータがある分だけ、ファイルF1とF2に全く同じデータを上書きしたい場合
こんな感じでいいのでしょうか?
上書きする部分だけループにしています。添削してもらえませんか?

open(F1,">$file1")||die();
flock(F1,LOCK_EX);
open(F2,">$file2")||die();
flock(F2,LOCK_EX);
foreach(@data){
($aaa,$bbb)=split(',',$_,2);
print F1 "$aaa,$bbb\n";
print F2 "$aaa,$bbb\n";
}
close(F1);
close(F2);

893 名前:nobodyさん [2006/01/29(日) 08:51:40 ID:1QlgYllq]
1個ロックしときゃいいんじゃないの?

894 名前:nobodyさん mailto:sage [2006/01/29(日) 09:17:31 ID:???]
>>892
書き出したファイルを読み出すことは無いの?
@dataで書き込むデータは常に増えて、減ることはないの?

上二つのどちらかでも該当すると ">"でオープンするのはまずいと思われ。

895 名前:nobodyさん mailto:sage [2006/01/29(日) 10:16:26 ID:???]
定番どころをまとめておくか。

search.cpan.org/~nwclark/perl-5.8.7/pod/perlfunc.pod#flock
www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq5.html#how_can_i_lock_a_file
web.archive.org/web/20040216083853/www98.sakura.ne.jp/~jun/perl/flock.html
homepage1.nifty.com/glass/tom_neko/web/web_04.html
www.bioinfo.jp/tips.html#flock
www.din.or.jp/~ohzaki/perl.htm#File_Lock



896 名前:flock [2006/01/29(日) 16:44:40 ID:rUKuWvJe]
>>893
F1とF2で別々のファイルを開くのに、ロックは1つで良いのですか!?

>>894
このcgiファイルでは、このF1やF2は上書きだけで終了です。
このスクリプトの中でF1およびF2の中に追加項目があったりするので、それを足したのをまた同じF1やF2に上書きするという処理をさせています。

ですので、このファイルでは
>書き出したファイルを読み出すことは無いの?
>@dataで書き込むデータは常に増えて、減ることはないの?
ということは無いです。

ただですね、他のcgiファイルでは読込みがあります。
F1とF2では用途が違うので同じ内容を2つに分けていますが、片方はダウンロードして使いたいのでCSVファイル、もう片方が他で読み込んで使う用途にtxtファイルにしています。
このtxtファイルの方も、他のcgiファイルのスクリプトの中で読み込みはしますが、項目が減ったり増えたりすることはありません。

私は、この部分が変に冗長になっているのではないかと思い、他に良い書き方は無いかと考えてみたのですが
どうしても他の方法が浮かばなかったのでこちらの専門スレに投稿させて頂いた次第です。

良かったら、他の書き方があればご教授願えませんでしょうか?

>>895
ありがとうございます。
その内4つは調べている段階で既読でした。
他のサイトを拝見してきます。

897 名前:flock [2006/01/29(日) 17:31:41 ID:rUKuWvJe]
>>895
今拝見してきたのですが、端的にflockの使い方良し悪しについて述べられているサイトを見つけるのが難しい中、プロセスから易しく書かれたものが見つけられました。
ありがとうございました。

その中にあった
web.archive.org/web/20040216083853/www98.sakura.ne.jp/~jun/perl/flock.html#99
の「ゴミ」というところに似た書き方をしているのではと、かなり不安になりました。
特にCSVファイルの方は、サーバからダウンロードして後から情報の閲覧や整理に使いたいので
(@dataに追加するデータは、ある条件を満たすもののみ○、そうでないものは何も書かないというごく簡単なものですが)
○では無いのに○が付いてしまったり、またはその逆などのエラーがあると困ってしまうのです。

ますますもって、このままで良いのか不安になってきました。
ファイルロックについて、このサイトのようにプロセスから細かく記されている書籍などはご存じないでしょうか?
もし、お暇でしたら私のスクリプトの不安箇所の訂正などして頂けたらありがたいのですが....

898 名前:nobodyさん mailto:sage [2006/01/29(日) 18:07:38 ID:???]
>>892
open(F1,"+<$file1")||die();
flock(F1,LOCK_EX);
open(F2,"+<$file2")||die();
flock(F2,LOCK_EX);
...
truncate(F2, tell(F2));
close(F2);
truncate(F1, tell(F1));
close(F1);

($file1,2は既に存在するとして)こんな感じかな。
同じ内容なら、一つのファイルにすることを考えた方がいいかも。
リンク張るとか。

> 「ゴミ」というところに似た書き方をしているのではと、かなり不安になりました。
同じファイルに対して排他的なロックすることで起こるデッドロックだね。
関係があるとしたら、File2とFile1を逆順に排他的にロックするプログラムが有るとき。
そのときはデッドロックを引き起こす可能性がある。

899 名前:nobodyさん mailto:sage [2006/01/29(日) 19:15:17 ID:???]
>>897
lock は結局読み込みから書き込みまでの間に何をするかなんだよな。
(読み込みが含まれるのは読み込んで書き込むまでの間に他の
プロセスが書き込みを行ってしまっていた場合に、新たに書き込む
データが既存のデータを壊してしまうから。)
だから本当は書き込みのところだけ晒されても正しいのかどうかは
判断できない。

ロックで具体的にこうしろというコードが表に出てこないのは
そういう理由もある。


900 名前:はは [2006/03/02(木) 23:54:04 ID:KQkmhtbv]
士ね

901 名前:nobodyさん [2006/03/03(金) 01:03:50 ID:QWJoZw1q]
更新処理はこうしてる。

if (!open(ORI,"$original_file")) { &error; }
if (!open(TMP,"> $tmp_file")) { &error;}
if (!open(LOCK, "$lock_file")){&error;}
flock(LOCK, 2);
while ($_ = <ORI>) {
#各種更新処理
print TMP "$changed_line";
};
close(ORI);
close(TMP);
&lock;
flock(LOCK, 8);
close(LOCK);

sub lock {
$list = `ls $ls`;
@lists = split(/\s+/,$list);
@lists = grep(/\.tmp/,@lists);
@lists = grep(!/$tmp_file/,@lists);
if (@lists) {
if (-e "$tmp_file") { unlink("$tmp_file"); }
&error;
}
if (!rename("$tmp_file","$original_file")) { &error; } ;
chmod 0666,"$original_file";
}

システムが瀕死の状態ん時に(年に1度ぐらい)壊れるが。


902 名前:nobodyさん mailto:sage [2006/03/03(金) 02:34:58 ID:???]
open my $lock, "> $lock_file" or die;
flock $lock, LOCK_EX|LOCK_NB or die;

open my $in, "< $data_file" or die;
open my $out, "> $tmp_file" or die;

while (my $line = <$in>) {
# bra bra bra
. . . . .
print $out $line or die;
}

close $out or die;
close $in;

rename $tmp_file, $data_file or die;

close $lock;

とかでいいんじゃね?

903 名前:nobodyさん [2006/03/03(金) 20:34:19 ID:QWJoZw1q]
>>902
flockを信じればそれでもいけるが、テンポファイルが何らかの障害で生き残った場合
リネームで致命傷。
ユニークなファイル名にしといた方が安全かなと。

904 名前:nobodyさん mailto:sage [2006/03/03(金) 22:52:47 ID:???]
つFile::Temp


905 名前:nobodyさん mailto:sage [2006/03/04(土) 01:20:31 ID:???]
flockを信じればって、じゃあ何を信じりゃいいのさ?
つか、flockすんならテンポラリファイルいらねーだろ。



906 名前:nobodyさん mailto:sage [2006/03/04(土) 03:20:16 ID:???]
use Fcntl qw/:DEFAULT :seek/;

sysopen my $fh, $file, O_RDWR|O_CREAT|O_EXLOCK, 0600 or die $!;
my $sz_file = -s $fh;
sysread $fh, my($buf), $sz_file or die $!;
my @data = split /\n/, $buf;

       :
       :

my $sz_data = length($buf = join "\n", @data);
sysseek $fh, 0, SEEK_SET or die $!;
if ($sz_data < $sz_file) {
  $buf .= "\n" x ($sz_file - $sz_data);
  syswrite $fh, $buf, $sz_file or die $!;
  truncate $fh, $sz_data or die $!;
} else {
  syswrite $fh, $buf, $sz_data or die $!;
}
close $fh;

907 名前:nobodyさん mailto:sage [2006/03/04(土) 15:29:33 ID:??? BE:79061827- ]
>>905
書き出し中に再起動したらどうする?
書き出し中に電源落ちたらどうする?

908 名前:nobodyさん mailto:sage [2006/03/04(土) 20:19:13 ID:???]
排他処理とは関係ないけど、907が言うような障害対策?を
まとめたサイトってありますか?

909 名前:nobodyさん mailto:sage [2006/03/04(土) 23:28:46 ID:???]
>>907
そこまで考える必要があるなら、DB使うよw

910 名前:nobodyさん [2006/03/05(日) 00:08:23 ID:j4KtSVTy]
>>909
そこまで考えるとDB使っても無理。
データは壊れるものと思って、定期的なバックアップは必要。
もちDBのほうが壊れにくいが、それでもMySQLなんて更新多いと壊れる事はある。
このスレはDB使えなくて、それでも極力ファイル破損させたくないって人が対象だろうから、
flock+店舗ファイルが正解なんじゃない?
共用鯖使ってる人が多いだろうけど、そういう鯖は完全に落ちなくてもflock効いてない時結構あったよ。
俺の借りてた鯖の場合は店舗ファイル使って、ずいぶん壊れにくくなったなぁと思うんだけど。

今は自鯖あるから俺もDB使っているけど。


911 名前:nobodyさん mailto:sage [2006/03/05(日) 01:35:17 ID:???]
open my $lock, "> $lock_file" or die $!;
flock $lock, LOCK_EX;
tie @data, "DB_File", $data_file, O_RDWR|O_CREAT, 0666, $DB_RECNO or die $!;
# 更新処理
untie @data;
close $lock;

これで壊れたことないんだけど、何か問題ある?

912 名前:nobodyさん mailto:sage [2006/03/05(日) 05:29:10 ID:???]
>>902
>>911
君らの方法でFAな気が酢


913 名前:nobodyさん mailto:sage [2006/03/05(日) 10:29:48 ID:???]
いやいや、
> LOCK_NB or die;
って、少しは待ってみるとかalarm仕込むとかしようよ。

914 名前:nobodyさん mailto:sage [2006/03/06(月) 09:58:45 ID:???]
>>910
> そこまで考えるとDB使っても無理。
SQLite3 なんかはトランザクション中に再起動や電源断があっても大丈夫って言ってるみたい。
やりかた次第じゃないかな。

915 名前:nobodyさん mailto:sage [2006/03/06(月) 20:50:40 ID:???]
いや、だから、ロックファイル+テンポリネームが答えなんじゃ・・・



916 名前:nobodyさん mailto:sage [2006/03/06(月) 21:18:04 ID:???]
テンポリネームwww

917 名前:nobodyさん mailto:sage [2006/07/14(金) 18:34:43 ID:???]
ここでよいのか分かりませんが。。

このスレを参考にflockでかなりファイルが壊れなくなりました
頭が下がる思いです

で、最近処理速度が気になります。
無論ハード面での影響があるとは思いますがflockで処理するより
MySQLなどを使った方が処理速度は飛躍的に向上しますか?
えろいひと教えて下さい

918 名前:nobodyさん mailto:sage [2006/08/18(金) 23:57:42 ID:???]
>>917
データ構造が巨大かつ複雑で、そこから任意の情報をいやらしい感じに読み書きするような話なのであれば、RDBMS に SQL 渡して丸投げしたほうが *効率は* いいと思う。
餅は餅屋というやつだ。

919 名前:七誌 [2006/10/27(金) 22:34:40 ID:Cj9z7A7l]
くぁWせDFRGTYふじKぉP;@:

920 名前:nobodyさん mailto:sage [2006/10/27(金) 22:50:51 ID:???]
もちつけ LとOが入れ替わってるぞ

921 名前:nobodyさん mailto:sage [2006/10/28(土) 16:57:21 ID:???]
すなおにsleepでいいじゃん。

922 名前:nobodyさん mailto:age [2006/11/04(土) 13:00:42 ID:???]
俺様が勉強してるからあげ

923 名前:nobodyさん [2006/11/11(土) 18:19:40 ID:umuRe6Kn]
結局、一番有効な排他処理は?

924 名前:nobodyさん [2006/11/28(火) 09:01:07 ID:+OyZsB34]
すみませんが、お聞きしたいのですが、
ローカルの環境でカウンターのファイルロックの強度を試すのに、for文で1000回カウンターのファイルにアクセスするスクリプトを作り、
それをタブブラウザで10個開いておいて、全てのタブを再読み込みさせて10000回カウントされているのを見るのは有効な手段でしょうか?
またネットワークにつながっているもう一台のパソコンからも、さらに同時に更新をかけて、20000回カウントされてるかどうか見るのは有効でしょうか?


925 名前:nobodyさん mailto:sage [2006/11/28(火) 09:11:11 ID:???]
「有効な手段」の定義が良くわからんが、タブブラウザ使っても
httpの同時セッション数が既定の2とかだとまったく意味ナサス。
素直にab(apache bench)とか使っとけ。



926 名前:nobodyさん mailto:sage [2006/11/28(火) 10:46:03 ID:???]
テストしてやるからソースを

927 名前:nobodyさん mailto:sage [2006/11/28(火) 11:35:28 ID:???]
テストしてやるからサーバを

928 名前:nobodyさん mailto:sage [2006/11/28(火) 13:00:47 ID:???]
テストしてやるからネットワーク接続を

929 名前:nobodyさん mailto:sage [2006/11/28(火) 16:34:07 ID:???]
テストしてやるからパソコンを

930 名前:nobodyさん mailto:sage [2006/11/28(火) 17:08:23 ID:???]
その前にとりあえずご飯を

931 名前:nobodyさん mailto:sage [2006/11/28(火) 19:23:59 ID:???]
その前に妹を紹介して

932 名前:nobodyさん mailto:sage [2006/11/29(水) 00:11:52 ID:???]
>>924
ロックには二種類しかない、駄目なロックと正しいロックだ。中間はない。
「ロックの強度」などと言うやつが作ったものは駄目なロックである可能性が非常に高い。

933 名前:nobodyさん mailto:sage [2006/11/29(水) 03:37:00 ID:???]
男は黙ってライブステージに立てロックを感じろ

934 名前:nobodyさん [2007/01/29(月) 15:46:57 ID:MdfhpFZP]
今夜ネットつながるのでファイルロックを研究するためこのスレ使いますね。PHPですけど。

935 名前:nobodyさん mailto:sage [2007/01/29(月) 17:47:33 ID:???]
ずんずんちゃっずんずんちゃっ
うぃ〜うぃるうぃ〜うぃるろっきゅ〜




936 名前:nobodyさん mailto:sage [2007/01/29(月) 18:21:17 ID:???]
それ lock じゃなくて rock

937 名前:nobodyさん mailto:sage [2007/01/29(月) 18:45:24 ID:???]
ファイルロックはデータファイル以外にロック用ファイルを用意したほうが楽だから
そうしてるけどデータファイル自体をロックする場合って
一時ファイルに書き出してデータファイル名にリネームした瞬間ロック解除扱いになるんだよね?

そうなるとロック待ちプロセスがデータファイルオープンしてファイルロック中にリネーム
されたらファイルが存在しなくなってファイルハンドルが無効になってファイルロックが偽を返すのかな?

938 名前:nobodyさん mailto:sage [2007/01/29(月) 19:04:35 ID:???]
とりあえずコードで説明して

939 名前:nobodyさん mailto:sage [2007/01/30(火) 10:08:22 ID:???]
>>937
> 一時ファイルに書き出してデータファイル名にリネーム
それ自体は何ら排他処理になっていない。書込途中のプロセス死亡と
いったケースでデータファイルが壊れるのを防ぐ為の手順。

ロックファイルを使わずに排他処理したいなら、

open my $fh, '+<', '/path/to/file' or die $!;
flock $fh, LOCK_EX;
...
close $fh;

のようになる。

940 名前:nobodyさん [2007/04/16(月) 16:21:56 ID:wXXA2dJL]
このスレも残りわずかですね

1つ疑問いいですか?
flockの有効範囲(?)っていうのがいまいち分からなくて。。
同一サーバ内、バーチャルドメインごと、1スクリプトごと。。。??

flockを使って、このスレにある方法を使い正しいロック方法の時だとします

ここまで読んだものから推測するとサーバ内であれば別のスクリプトから呼び出しても効きますよね?(ファイルハンドルが同じなら)

逆に言えばflockを使っているファイルハンドルを別のスクリプトで使ったら解除してしまうってことですか?
レン鯖みたいな共用鯖でよく使いそうなファイルハンドル(INとかOUTとか)でflockを使うと危険なんですかね?




941 名前:nobodyさん mailto:sage [2007/04/16(月) 16:38:48 ID:???]
言語に備わってるファイルロック関数は信用してはいけない

942 名前:nobodyさん mailto:sage [2007/04/16(月) 18:29:01 ID:???]
>>940
Perlのflockは様々な実装があるので、ここではUnix互換OSのflock(2)が
使われた場合とすると、

・flockはOSの機能なので、機能するのはOSの範囲内。
・正しい書き方をすれば、別のプロセスがロックを外すことは無い。
・別プロセスからのflockの開放は可能らしい。

943 名前:nobodyさん mailto:sage [2007/04/16(月) 18:31:45 ID:???]
ファイル構造体にフラグ立ててるわけだからファイルハンドル・別スクリプト云々は考えなくていいっしょ

944 名前:nobodyさん mailto:sage [2007/04/16(月) 19:58:57 ID:???]
mkdirが使えるなら絶対そっちのほうがいいよ

945 名前:nobodyさん mailto:sage [2007/04/23(月) 18:26:23 ID:???]
>942
遅ればせながらォです




946 名前:nobodyさん mailto:sage [2007/04/23(月) 20:20:20 ID:???]
NFSを介した向こう側のファイルを開く時はflockが効かなかったりする。

947 名前:nobodyさん mailto:sage [2007/04/26(木) 17:01:49 ID:???]
>>946
(OSが管理してるので)同じサーバ内でならflockでいい。
別のサーバからのアクセスもロックしたいなら
lockd動かしてfcntlでロックする。


948 名前:nobodyさん [2007/04/29(日) 20:50:11 ID:QRYQeqJ7]
ファイルロックって、馬鹿ですか?
mutex使えよ、アホ

949 名前:nobodyさん mailto:sage [2007/04/30(月) 00:26:57 ID:???]
>>948
Windowsなんて糞なサーバ使うより1000万倍まし。

950 名前:nobodyさん mailto:sage [2007/04/30(月) 14:00:30 ID:???]
>>946
そういうときは、fcntlを使うようにオプションで指示してコンパイルする。


951 名前:nobodyさん mailto:sage [2007/04/30(月) 14:26:51 ID:???]
ファイルロック関数に頼ったロックに頼るべきではない。
独自に考えるべき

952 名前:nobodyさん mailto:sage [2007/04/30(月) 17:20:06 ID:???]
ここはスレタイにあるとおり、「perl」でという制約の元の排他制御に
関する議論をするスレッドなんだよ。
しかもwebprog板なので、サーバーサイド限定だ。
すなわちWin限定の解は採点が低い。

953 名前:nobodyさん mailto:sage [2007/04/30(月) 18:09:45 ID:???]
次スレは言語選ばないべき。過疎ってるから

954 名前:nobodyさん mailto:sage [2007/04/30(月) 18:34:21 ID:???]
PHPも仲間に入れてやってください

955 名前:nobodyさん mailto:sage [2007/04/30(月) 22:19:01 ID:???]
PHPか。



956 名前:nobodyさん mailto:sage [2007/05/01(火) 08:41:54 ID:???]
Perlで1個作って、それを移植するだけだろw

957 名前:nobodyさん mailto:sage [2007/05/01(火) 11:06:12 ID:???]
>>956
ほとんど同じでOKなの?

958 名前:nobodyさん mailto:sage [2007/05/03(木) 07:37:55 ID:???]
5年前のスレかよw

959 名前:nobodyさん mailto:sage [2007/11/12(月) 23:00:45 ID:???]
半年前のレスかよ

960 名前:nobodyさん [2007/11/25(日) 15:43:12 ID:YhRNGWJK]
ageてみるか

961 名前:nobodyさん mailto:sage [2008/03/14(金) 20:29:09 ID:???]
このスレが無限ロックされてるんじゃね?w

962 名前:nobodyさん mailto:sage [2008/08/08(金) 02:57:43 ID:???]
flockにロックIDとかつけてくんないかなー
部分ロックしたいときに困る

963 名前:nobodyさん [2008/08/08(金) 02:59:41 ID:V81X7ey0]
ていうかファイルに対するlockじゃなくて、完全にIDのみで管理するロック機構があれば応用がきくのに
そういうのって何で作られないの?何かわけがあるの?

964 名前:nobodyさん mailto:sage [2008/08/08(金) 10:06:25 ID:???]
ファイルに対してlockしないでなににlockするんだい?

管理はファイルごとに行うんじゃなくてファイルハンドルごとに行うんじゃないかい?
ま、ルールに則って処理しなければlockはいくらでも無視できるけど

965 名前:nobodyさん mailto:sage [2008/08/08(金) 19:52:28 ID:???]
何言ってんのさ。
mkdirとかを用いた方法だって、あくまで"処理のロック"だろ。
その処理ってのがファイルアクセスだったときにファイルロックになるだけでさ。

わざわざロック専用のファイル作ってそれにflockかける場合のこと考えると、「対象としてのファイルがなければロックできない」ってのはどうにも無駄な制限だと思うんだけど。


って書いたけどIDだけでの管理は共用鯖とかだと現実的じゃないな。



966 名前:nobodyさん mailto:sage [2008/08/08(金) 20:28:34 ID:???]
System V IPCのセマフォ使えばいいんじゃない?
perlなら組み込み関数あるし、CPANにもライブラリあるよ。

967 名前:nobodyさん [2009/09/07(月) 18:18:57 ID:0FwHnD5n]
質問です。
apacheのアクセスログの様にとにかく最後尾に追記するだけの場合、排他処理は必要ですか?

use Fcntl;
sysopen(OUT, $FileName, O_WRONLY|O_CREAT|O_APPEND);
print OUT "aaa\n";
close(OUT);

これだけで済めばいいな〜というのは甘い考えでしょうか?

968 名前:nobodyさん mailto:sage [2009/09/09(水) 17:11:40 ID:???]
追記は確か混じった。


969 名前:nobodyさん [2009/09/09(水) 17:27:59 ID:jdeXznBz]
>>968
レスありがとうございます。
後で編集するので書き込まれる順序は特に気にしませんが
一応flock程度はやっておこうかなと思ってます。

970 名前:nobodyさん [2009/09/13(日) 16:22:21 ID:YylJyw/3]
それは print を使うからでは。
一回のシステムコールで書き込まれるようにすれば?
syswrite を使うか、バッファを無効にする。

971 名前:nobodyさん mailto:sage [2009/10/08(木) 14:28:23 ID:???]
書き込みすんだったら、
ロックは必須でしょう?

972 名前:nobodyさん mailto:sage [2009/10/12(月) 23:17:19 ID:???]
このスレでも何度かいわれたし、
www.bioinfo.jp/tips.html#append に詳しく書いてある。
確認してみれ。

973 名前:nobodyさん mailto:sage [2009/10/19(月) 19:57:43 ID:???]
システムに依存するけど、どの操作もアトミックにできれば、ロックはいらねぇって話だわな。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前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