Path: kt.rim.or.jp!not-for-mail From: "Canada, Masakatz" Newsgroups: rim.infosystems.www Subject: Re: File Lock Date: Sun, 01 Nov 1998 17:19:06 +0900 Organization: Kaede Kobo Lines: 75 Message-ID: <71h5hr$ri8$1@news.kt.rim.or.jp> References: <362364D6.6105@kt.rim.or.jp> NNTP-Posting-Host: ppp405.kt.rim.or.jp Mime-Version: 1.0 Content-Type: text/plain; charset=iso-2022-jp In-Reply-To: <362364D6.6105@kt.rim.or.jp> X-NewsReader: Datula version 1.06.06 on Windows NT 4 Xref: kt.rim.or.jp rim.infosystems.www:1741 Akihiro Yamauchiさんの<362364D6.6105@kt.rim.or.jp>から >本をみたら >open(LOCK,"$lockfile"); >flock(LOCK,2); >print LOCK $data; >flock(LOCK,8); >close(LOCK); >という例が載っていてとても簡単そうだったのですが、Webをみてまわってたら >この書き方は間違ってると書かれているページがありました(今手元にURLがな >いのでここでは書けませんが)。 多分タイプミスだと思いますが、$lockfileにファイル名が 入っているとしたら、読み取り専用でオープンしてるので、うまく動かないで しょうね。 で、open(LOCK, ">>$lockfile");としているとして、 最後のflock(LOCK, 8);については、「バッファをFlushしないまま ロックを外してしまう事があるので、flock(LOCK,8)とclose(LOCK)の間に 別のプロセスがファイルをオープン&書き込みしてしまうとデータが壊れる 事がある」という話を聞いた事があります。 ただし、うちのFreeBSD2.2.1では、flock(LOCK, 8)を行う時にバッファを フラッシュしているようなので心配なさそうなのですが。 まあ、flockはファイルハンドルを閉じる時に自動的に外れるので、flock(LOCK,8)は 入れない方が安心かもしれません。 また、flock(LOCK,2);で、ロックが外れるのを待っている間に誰かがファイル に追加を行うと、その部分が失われてしまう事があります。 というわけで、 open(LOCK,">>$lockfile"); flock(LOCK,2); seek(LOCK, 0, 2); # ファイルの最後までSeekする print LOCK $data; close(LOCK); # flock(LOCK, 8)は入れない。 とすると大丈夫でしょう。 あと、open(LOCK, ">$lockfile")とした場合、「まずファイルを消去してから」 ロックをかけるので、ちょっと危険です。 seekを使う方法もありますが、システムによって挙動が違ったりするので、 周りを別のロックで囲ってやるのが一番安全でしょう。 >それでsymlinkというのを使って、 >$lock_file ="./temp/file.lock"; >sub process_lock { > local($wait) = 10; > while (!symlink(".",$lock_file) ) { > &error ("Error") if --$wait <= 0; > sleep (6); > } >} >と書くといいと書いてありました。 >さっそく試してみたのですが、CGIを実行すると異常に時間がかかり、その後500 >エラーが出てしまいました。 以下をチェックしてください。 ●tempというディレクトリが存在するか? ●tempのパーミッションが、757や707になっているか? ●プロセスが終了するときにちゃんと「./temp/file.lock」を消去しているか? ●すでに、./temp/file.lockというファイルが存在してないか? >RIMではsymlinkは使えない、というのならしょうがないですが、どこか別のとこ >ろに原因があるのでしょうか。 RIMではsymlinkは使えるので、別の(おそらく上記に挙げた)理由でしょう。 ただ、symlinkを使った方法だと、何かの拍子にロックをかけたまま プロセスが落ちてしまった場合などにロックファイルが残ったままに なると、以降まったく書き込みが出来ない(エラーしか帰ってこない) ことになってしまうので、素直にflockを使った方がいいと思います。 -- Canada, Masakatz mailto:canada@tt.rim.or.jp