新規記事投稿 フォロー記事投稿 記事のキャンセル
From: にあ <nir@mxa.meshnet.or.jp>
Subject: ノンブロッキングロックについて。
Date: 1996/09/10 00:26:03
Reference: mesh.open/00122

9月9日に、かん(管理人)さんは書きました。

>># 頼むから、ファイルをロックするときはノンブロッキングでやってくれー
>
>ふみゅ、それってどんなのか教えてください(^-^;
>
ファイルをロックする時のモードには、ロックできるまで待つブロッキングモードと
ロックできないときは待たずにエラーを返すノンブロッキングモードがあります。

もしブロッキングモードでファイルロックを行なっていると、何らかの事故でロックが
外れなくなったプロセスが出来た時、後から起動された同じファイルを必要とする
プロセスが、次から次へとロック待ちで止まってしまい、プロセステーブルを食い
つぶしてしまうことになります。

ノンブロッキングモードでロックしていれば、この様な場合、後から起動したプロセスは
エラーにはなっても、システムダウンへと導くような恐ろしいことは起きない訳ですね。

具体的にはここのスクリプトなどを見ていただければよろしいのですが、flock() を
LOCK_EX|LOCK_NB (=6) で呼んで、もしもその時ロックできなければ、少し待ってから
またロックしてみる、と言うのをくり返し、ある限度回数試みてもダメな時はエラーに
する、と言うような事をすれば良いと思います。

この限度回数(と言うか限度時間)はそのプロセスが呼ばれるであろう頻度と相談して
決める必要があります。例えば、1秒間に10回呼ばれるようなプロセスで、1分も待って
いたら、たちまちプロセスが溜まってしまいますから、チョットしたさじ加減が必要
でしょう。