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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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





























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

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

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

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


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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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


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

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

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

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

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

みたいなのは


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

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

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


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

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


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


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


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


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

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

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

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

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

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



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

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

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

〜処理〜

fclose($lock);

でいいんでないかな。


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

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


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

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

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

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

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

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

こんなことしてます。

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

一連の処理

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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

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


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

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



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

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

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

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

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

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


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

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


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

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


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

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


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




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

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

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

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

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

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




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


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

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


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




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

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



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

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

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

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

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

では。

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

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




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

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


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

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

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

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

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

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

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

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

1 symlink
2 mkdir
3 flock
4 rename

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


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

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

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

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










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











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

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


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

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


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

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

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

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



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

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


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

どういう意味?


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

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

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


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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

return rmdir "$file.lock";


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

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

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

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

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

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

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

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

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





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






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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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


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

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

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

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

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

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

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


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

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

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

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


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

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

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

これじゃだめか?

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

if($lockkey) {
  &unlock;
}

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

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

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

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

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

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

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

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

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

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

ロックファイル作成

ファイル読み込み

ロックファイル消す

カウントUP

ロックファイル作成

ファイルに書き出し

ロックファイル消す

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


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

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

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


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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


眠たい

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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


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

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

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

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

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

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



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


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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

use Fcntl qw(:flock);

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

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

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

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

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

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

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

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

#hogehoge処理

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

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


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

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

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

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

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

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


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


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

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


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

#hogehoge処理

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

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

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

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

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

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

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

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

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



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

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

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

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

あー、言いにくい

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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さん: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
いいサイトだ♪http://homepage3.nifty.com/digikei/ten.html

344 :nobodyさん: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     |
|____________________|______________|

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

357 :bloom:03/04/17 22:56 ID:ahUYqmP+
http://www2.leverage.jp/start/

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

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

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

361 :nobodyさん:03/04/19 13:00 ID:EJZQKwDz
http://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さん:03/04/19 15:13 ID:???
>>361
うん、これで問題ないね

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

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

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

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


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

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

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

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

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


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

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

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

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

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

377 :nobodyさん: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さん:03/05/22 10:08 ID:???
>>378
違う。
if (mkdir ("lock", 755)) {
  (処理)
}

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


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

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


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

383 :380 じゃないけど: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さん:03/05/23 13:28 ID:???
>>385
見ろ。

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

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

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

どうすれバインダー。

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

391 :nobodyさん: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さん: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さん:03/06/01 12:29 ID:???
>>393
禿げ藁

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

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


399 :nobodyさん: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
みてね♪
http://www1.free-city.net/home/s-rf9/page006.html

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




403 :nobodyさん: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
http://homepage.mac.com/yuuka20/

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

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


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

まだ逝ってないよ、俺。

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

--$retry <= 0

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


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


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

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

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

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

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

--$retry <= 0

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

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


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

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

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

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

417 :_:03/06/02 14:38 ID:???
http://homepage.mac.com/hiroyuki43/moe/jaz01.html

418 :_:03/06/02 16:09 ID:???
http://homepage.mac.com/hiroyuki43/moe/jaz01.html

419 :_:03/06/02 19:13 ID:???
http://homepage.mac.com/hiroyuki43/hankaku/hankaku07.html

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

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


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

423 :nobodyさん: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 :なぞなぞ先生:03/07/08 06:24 ID:???
排他処理するために必要な国家資格はなぁんだ?

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

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

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


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

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

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

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




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

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

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


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

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

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

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

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

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

氏のう。。。。

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

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

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

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

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


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

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


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

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

下手な考えスマソ。。。

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

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

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

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

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

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

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

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

451 :nobodyさん:03/07/26 13:24 ID:???
>>450
>>1-449

452 :nobodyさん:03/07/26 13:55 ID:???
>>451
ワロタ!
でも、イイ!

453 :_:03/07/26 13:55 ID:???
http://homepage.mac.com/hiroyuki44/

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

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

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

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

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

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

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

458 :nobodyさん:03/07/27 03:14 ID:???
結論が出てしまったな・・・

459 :nobodyさん:03/07/27 09:30 ID:???
ドコ━━━(゚Д゚≡(゚Д゚≡゚Д゚)≡゚Д゚)━━━━!!!!???

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


461 :nobodyさん: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さん:03/08/07 14:18 ID:???
意味不明。
LOCK_EXは定数(を返すだけのsub)

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

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

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

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


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

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

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

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

さすがに読めません。

479 :nobodyさん: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);

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

http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq5.html#How_come_when_I_open_the_file_re
http://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:03/08/27 22:53 ID:???
>truncate(LOG, ftell(LOG));
間違いでした。以下の通り。
truncate(LOG, tell(LOG));

481 :nobodyさん: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さん:03/08/31 04:22 ID:???
>>482
「dbfileを使うプロセスは、かならずdbfileにアクセスする前にlockfileをロックする」
という紳士協定があればうまく行く。

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

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

484 :nobodyさん: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さん:03/08/31 23:56 ID:???
ついでですが、ファイルを排他ロック(LOCK_EX)するときは、
書き込みできる状態でファイルをオープンしないとロックしない
OSがあるそうです。ご注意あれ。

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

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

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

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

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

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

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


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

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

492 :490:03/09/04 22:14 ID:???
そっか、タイミングがちょっと遅くなるだけで、結局待たされるんだ。。。
って事でhttp://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さん:03/09/06 02:09 ID:???
俺もDBマンセー

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

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

497 :nobodyさん: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さん:03/09/07 15:01 ID:???
>>498
あとは昔のOSでバッファをフラッシュしないくらいしか思いつかないなあ。

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

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

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

502 :nobodyさん:03/09/07 15:14 ID:???
そんな感じだな

503 :496: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さん: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さん:03/09/07 22:35 ID:???
>>505
ソースとdfの結果みせてみな。

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

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

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

・・・は?

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

多分間違ってると思う。

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

>ロックの残骸
って何?

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

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

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

509 :nobodyさん:03/09/08 10:14 ID:???
>508
ハゲドウ

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

510 :496: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さん:03/09/08 23:47 ID:???
>>510=>>496
こいつ何言ってんだ?勝手にデータベース使うな。

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

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

513 :496: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さん:03/09/12 19:43 ID:???
システムのロック以上の能力を持つロックは不可能です。

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

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

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

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

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

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

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

521 :nobodyさん:03/09/15 06:42 ID:???
えふろっく

522 :nobodyさん:03/09/15 07:54 ID:???
ファイナルロック>510


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

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


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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

535 :532:03/09/30 11:52 ID:???
nfsの間違えでした(スマソ

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

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

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

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

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

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

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



540 :nobodyさん:03/10/02 16:33 ID:???
>>539

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

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


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

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

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


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

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

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

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


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

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

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

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

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


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

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

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


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

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

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

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


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


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

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

555 :nobodyさん: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さん:03/11/05 14:16 ID:???
552だ。

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


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


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

560 :nobodyさん:03/11/08 13:37 ID:???
無茶苦茶???いったい何が???

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


562 :nobodyさん:03/11/08 17:35 ID:???
addrだった。

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

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

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

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

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

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


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

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


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

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


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

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

573 :572: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さん:03/11/09 19:59 ID:???
>>573
あれが自演ならお前さんも>>569か?って事になるじゃん…。
本当だったら煽った挙句自演呼ばわりですかって感じで笑えるけど。


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

577 :nobodyさん:03/11/09 20:54 ID:???
>>572
馴れ合い?

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

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

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

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

582 :nobodyさん:03/11/10 16:19 ID:???
もうほっとけほっとけ

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

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

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

586 :nobodyさん:03/11/10 20:34 ID:???
>>585
何の管理?

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

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

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

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


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


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

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

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

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

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


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

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

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

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

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

597 :nobodyさん:03/11/15 08:26 ID:???
>>590はどうなの?

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

599 :nobodyさん:03/11/16 17:34 ID:???
はいはい、あっち行ってね

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

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

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

603 :nobodyさん:03/11/18 14:37 ID:???
>>601
釣れますか?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

615 :nobodyさん:03/12/04 07:40 ID:???
ここは進行遅いですね。

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

616 :nobodyさん:03/12/04 11:19 ID:???
>>10,>>12

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

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

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

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

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

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

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

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

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

626 :nobodyさん:03/12/21 16:43 ID:???
yahoo

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

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

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

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

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

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

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

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

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

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

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

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

636 :nobodyさん:04/03/14 16:47 ID:???
>>424
歯痛か!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

647 :642:04/03/19 16:28 ID:???
>>646

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

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

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

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


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

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

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

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


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

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

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

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

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

ダサいけど。


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

662 :nobodyさん:04/04/16 01:00 ID:???
filerock

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

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

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

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

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

668 :nobodyさん:04/04/26 01:31 ID:???
干渉とは?

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

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

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

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

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

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


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


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

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


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

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

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

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

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

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

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

683 :nobodyさん: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さん:04/05/19 04:50 ID:???
>>683
みんな読むだけだったら別に排他制御は全然要らんよ。

685 :nobodyさん:04/05/19 07:03 ID:???
683氏に似た質問です。

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

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


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

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

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

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

689 :nobodyさん:04/05/19 18:15 ID:???
>誰かがファイルオープンしているときに別プロセスからファイルを読みこもうとした場合openエラーになっちゃいますよね。

これがそもそも勘違いだしな。

690 :nobodyさん:04/05/19 19:43 ID:???
>>688
Windows はどうだか知らんけど、
UNIX なら読み出すだけならアクセス集中でオープンエラーなんてないだろ。

つーか、そこまで信頼性高いシステムが必要なら、2ちゃんなんかで質問するより、
もっとちゃんと調べて勉強するか、外注に出した方が良いんじゃないか?

691 :683:04/05/19 23:00 ID:???
>>689
ありがとうございます。
吐いた制御ってオープンエラーを防ぐんじゃなくて、書きこみが同時に行われてファイルが壊れるのを
防ぐためにあるってことですね。

>>690
ありがとうございました。

692 :685:04/05/20 15:35 ID:???
>685です。レスが遅れてすみません。
返答ありがとうございます。

>>686
Dirty readとは書き込み中に読み込めるということで、最新でないものを読み込めてしまうということでしょうか。
それは構いませんし、リロードで直る一時的なものであれば読み取りが0バイトでも構いません。

>>687
そういう事になるかも知れません。
言い換えると
書き込み処理が重複しない時、理論的にファイルが壊れるか否かが知りたいのです。

693 :nobodyさん:04/05/20 20:28 ID:???
ファイルを壊す原因は山ほどあるが、
その中でも「書き込み処理が重複する」という原因はよく起こる。
この重複を避けるための道具が、ファイルロック。

ロックは、これさえかければファイルが壊れなくなるという魔法の杖ではない。
ロックは単なるプログラミングの道具に過ぎず、
それも、ファイルを壊さなくするための道具ではなく、
書き込みが重複しているかどうかを識別するだけの道具。
識別した上で書き込みが重複しないようにプログラムを書くのは、プログラマの責任。

逆に、書き込みが重複しないということが100%保証されているなら、
ロックをかけてもかけなくても変わらない。
もちろんその場合でも、書き込み処理重複以外の原因でファイルが壊れることは、いくらでも考えられる。

694 :nobodyさん:04/05/20 20:38 ID:???
書き込みが重複しないということをロック以外の方法で100%に近い精度で
保証する方法なんてあるのか?


695 :nobodyさん:04/05/20 21:07 ID:???
>〜するだけの道具。
まではいい事言ってると思うんだが最後の方になって壊れてるな。

696 :nobodyさん:04/05/20 22:40 ID:???
>>694
単に、書き込みが100%重複しない論理空間を仮定すれば、というだけの話でしょ。
もちろん現実にそんなことはありえないと暗示しているわけで。

697 :685:04/05/21 01:02 ID:???
皆様回答ありがとうございます。

>>693
という事は書き込みが重複しないなら、
ファイルロックで防げる程度のトラブルは防げるという事ですね。

>>694
書き込み処理を行えるのがパスワードを知っている1人なのです。
パスワードが他人に漏れず、その1人が同時に操作せず、
openしたまま処理が中断することもない・・・
という仮定はありますが。

ファルイロックの基本的な知識さえない私に丁寧な回答ありがとうございました。

698 :nobodyさん:04/05/27 13:48 ID:???
やっと最近になってきっちりしたファイルロックのコード書けるようになった。

けっこうウソ書いてあるサイトが多いのに驚いた。

699 :nobodyさん:04/05/27 17:15 ID:???
>>698
そういうサイトもきっちり書けていると思ってんだろ。
お前と同じように。

700 :nobodyさん:04/05/27 20:14 ID:???
きっちり書けるようになったと自分で思い込むのは勝手だが、他人には言うな。

701 :nobodyさん:04/05/27 21:10 ID:???
どうキッチリ書いたか教えて欲しい

702 :nobodyさん:04/05/27 21:08 ID:???
どう書いたか教えて欲しい

703 :nobodyさん:04/05/28 01:38 ID:???
うん
見せてよ

704 :698:04/05/28 11:16 ID:???
わたしは秘密主義なんで弟子にも教えることはない。

自分で掴み取れ!  これに尽きるな

705 :nobodyさん:04/05/28 15:29 ID:???
ふっ。これで糞コード蔓延の芽がまた一つ摘み取られた。良かった良かった。

706 :nobodyさん:04/05/30 14:43 ID:???
ファイルロックなんかしなくったって、めっちゃ速く処理してしまえばええやん

707 :nobodyさん:04/05/30 14:44 ID:???
>>706

すげー!! それだっ!

708 :nobodyさん:04/05/30 18:12 ID:???
ファイルロックなんかしなくったって、誰もアクセスしなければええやん


709 :nobodyさん:04/05/30 22:14 ID:???
windowsならmutexを使う手があるよん。名前にファイルパス(\は/に置き換えたやつ)
を使う。速いしいいぞ。


710 :709:04/05/30 22:16 ID:???
はっ、ここはPerlの板だった。
xs使って作るしか、、、。


711 :nobodyさん:04/05/30 22:23 ID:???
>>709 Win32::Mutex
http://search.cpan.org/~gsar/libwin32-0.191/

712 :nobodyさん:04/05/31 00:08 ID:???
おお、あるんだ。
他のOSとかもないのかな。
lock::mutexとかいう一本にまとめて使えるようなライブラリがいいなぁ。
mutexもセマフォも使えないけどflockは使えるOSだったら、
内部実装はflockでやるとか。


713 :357:04/05/31 20:57 ID:???
flock使えない機種でmutexを使ってflock模擬したほうがいいか。


714 :713:04/05/31 22:53 ID:???
うわ、名前間違えた。

715 :nobodyさん:04/10/09 22:28:45 ID:???
ダレモイナィ
タアソウスルナラ イマノウチ

716 :nobodyさん: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さん:04/10/10 04:46:13 ID:???
萌えは初心者だから良くわからないけど、
$count=$count++;

$count++;
でいいと思うけど。

718 :nobodyさん:04/10/10 16:53:04 ID:???
>>716
いいえNG

719 :716:04/10/10 16:59:43 ID:???
>>718
どこら辺がNG?

720 :nobodyさん:04/10/10 17:10:11 ID:???
無駄なことをやってるだけだろ

open (IN, "count.dat");
flock(IN,2);
$count=<IN>;
$count++;
print IN $count;
close(IN);

これでいいじゃん

721 :716:04/10/10 17:16:22 ID:???
えっ?それじゃ書き込めないのでは?

722 :nobodyさん:04/10/10 17:19:40 ID:???
すまん

open (IN, "+>count.dat");

723 :716:04/10/10 17:36:23 ID:???
カウンタだとそれでいいけど、掲示板など複数のファイルを弄る場合にはロック用のファイルが必要になるよね?

724 :nobodyさん: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さん:04/10/21 19:24:18 ID:???
実装言語がどれでも中では flock(2) を呼ぶわけだし flock() で問題ないんじゃない?

728 :nobodyさん: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さん:04/10/22 17:20:32 ID:???
通常、perlのflock()もphpのflock()も、下位レベルで使ってるシステムコールはflock(2)なわけだが。

731 :nobodyさん:04/10/23 01:59:39 ID:???
言語, OS, ファイルシステム等の実装に依存
php4.3.9/linux はソース確認したところ flock(2) 使ってないよ。fcntl(2)。

732 :nobodyさん:04/10/23 02:53:34 ID:???
perl5.8/linuxはflock(2)だっけ?fcntl(2)だったっけ?

733 :nobodyさん: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さん:04/10/23 13:22:56 ID:???
おお、すばらしい。
flock(2)使える環境って前提になるが(BSD,SystemV,Linux?)、PerlでもPHPでもflock()でいけるのか。
NFS上のディスクは別として。

735 :nobodyさん:04/10/25 18:24:04 ID:???
なるほどねぇ

736 :nobodyさん:04/10/25 19:07:12 ID:???
lockアゲ

737 :nobodyさん:04/11/06 19:49:00 ID:em3fuQlS
 

738 :nobodyさん:04/11/06 19:58:00 ID:???
flock最強神話

739 :nobodyさん:04/11/07 05:49:26 ID:???
RDBMSで行ロック最強

740 :nobodyさん:04/11/07 23:08:21 ID:???
結局、KENTのmkdirやsymlink、初心者のよく使うflock、どこかでみたrename、格付けするとどうなの?

741 :nobodyさん:04/11/08 00:05:16 ID:???
>>740
格付けなんて意味ないのでは?適材適所でしょ。

742 :nobodyさん :04/11/08 00:10:15 ID:???
>>740
flockを使う奴は素人だといいたいのか〜(w

743 :nobodyさん: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:04/11/08 21:24:24 ID:???
いや…そういう訳じゃ…

746 :nobodyさん:04/11/08 23:46:08 ID:???
cmpxchg最強

747 :nobodyさん:04/11/09 03:55:57 ID:???
>>744
レイヤーセクションじゃなかったっけ?

748 :nobodyさん:04/11/09 07:25:54 ID:???
>>740
flock>>>>>越えられない壁>>>>>rename=symlink>>mkdir

749 :nobodyさん:04/11/09 08:59:34 ID:???
flockはNFS介して使うと壊れるから糞

750 :nobodyさん:04/11/09 13:16:33 ID:???
激しくループしてるな。

751 :nobodyさん :04/11/09 13:43:34 ID:???
ネタがファイルロックだけだから進展しようが無い

752 :nobodyさん:04/11/09 20:07:15 ID:???
>>749
NFSを使った事無いので、良く分からないので教えてください。

NFSを利用する時はflock関数にflock(2)ではなくfcntl(2)を利用するように
perlをビルドすると思いますが、それでもロックは壊れるのでしょうか。
fcntl(2)で壊れる場合、実際の解決手段として、どのようなものがあるのでしょうか。

753 :nobodyさん:04/11/10 00:42:16 ID:???
>>752
Maildir

754 :nobodyさん:04/11/10 01:28:10 ID:???
>>753
djb 厨ってホントにいつも頭使わずに発言するなあ。

755 :nobodyさん:04/11/10 21:25:46 ID:???
>>753
それは、ロック機構が無くても信頼できるメールボックスの話だと思うのですが、
一般的なファイルアクセスにも使えるのでしょうか。

756 :nobodyさん:04/11/12 07:07:11 ID:djvAfFkI
>>747
レイフォース >>>> 越えられない壁 >>>> レイヤーセクション

757 :752: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さん:04/11/14 12:08:06 ID:???
レイフォース=ガンロック >> php >> perl >> レイヤーセクション >> レイストーム / レイクライシス

760 :nobodyさん: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さん:04/11/18 20:49:35 ID:???
おめーらロックすんぞ

765 :nobodyさん:04/11/27 15:36:14 ID:o5xdYnQz
ファイルロックって読み込むときは必要無いの?

766 :nobodyさん:04/11/27 15:54:59 ID:???
ロックするべ?

767 :nobodyさん:04/11/27 17:40:53 ID:???
>>765
書き込みが行われず中身が固定のファイルなら不要

768 :nobodyさん:04/12/04 12:35:02 ID:???
質問しに来たらすでに同じ質問してる人がいた。

>>765-767
サンクス

過去ログは見るもんだ。

769 :nobodyさん:04/12/04 19:37:01 ID:???
それは過去ログって言わないけどな

770 :nobodyさん: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さん:04/12/20 15:14:56 ID:???
>>770
追記であろうがなかろうが書き込みはロックした上で行われるのなら
読み込みだけのときはロック不要。

773 :nobodyさん:04/12/20 15:30:20 ID:???
>>771
プロセスが死ねばロックは解除される。
先頭と末尾でロックと解除をするようにするのはいいが、
パフォーマンス低下は明らか。

774 :nobodyさん:04/12/20 16:09:04 ID:???
mod_perl や mod_php のときって
スクリプトの実行が終了してもプロセスは死なないと思うけど
mod_* がスクリプト中の flock の後始末を面倒見てくれるんですよね?

775 :nobodyさん:04/12/20 20:09:18 ID:???
>>770
二つ以上のプロセスが同時に追記したら、データが混じる可能性があるし。

>>772
勧告ロックはそうはいかない。

>>774
PHPは面倒みてくれるけど、mod_perlのファイルハンドルは無理。
だから、IO::File,FileHandleモジュールなどを使う。
http://perl.apache.org/docs/1.0/guide/porting.html#Filehandlers_and_locks_leakages

776 :770: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さん:04/12/20 21:25:58 ID:???
>>776
ロックして書き込み中は読み込もうとしてもアクセスできないだろ。

779 :nobodyさん:04/12/20 22:28:54 ID:???
>>776
追記モードでも、書き込み途中の中途半端なデータを読む可能性を考えればダメでは?

780 :nobodyさん:04/12/20 23:16:39 ID:???
>>778 なこたぁない。。

>>779
そだね

けちろん: 読み込みデータがハンパでもいいタイプのシステムなら
ロックは無用。読み込みデータがその後のデータに関わってくるのなら
ロック白

781 :nobodyさん:04/12/20 23:47:40 ID:???
>>778
ロックの掛け方による

>>779
例えば固定長なら書込み途中のデータを見分けて使わない機構とかできそうな予感がするな?

>>780
そのけつろんは読みの場合限定ってことで

782 :nobodyさん:04/12/21 06:25:34 ID:???
>>778
アドバイザリロックはいくらでもロックを無視できる。

783 : :05/02/02 14:16:34 ID:hfbAK0ph
 

784 :nobodyさん:05/02/26 07:20:55 ID:???
ロック状態を保持するデーモン作る


203 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)