2016-12-06 1 views
-1

私たちは/ tmpディレクトリにopen()を使ってファイルを作成し、フラグLOCK_EXを持つflock()を使ってファイルをロックするソケットサーバーを持っています。 LOCK_NB。 flock()の戻り値を確認し、エラーがEWOULDBLOCKの場合はソケットサーバーを終了します。戻り値が成功した場合、終了します。これは、常に1つのSocket Serverだけが常に実行されていることを確認するためです。なぜロックを作成したプロセスが終了したときにファイルのロックが削除されないのですか?

しかし、ロックを作成したプロセスが終了すると、ファイル上でロックが削除されないことがわかりました。したがって、その後のSocket Serverの起動(既存のSocket Serverプロセスが終了したとき)は、この理由により失敗します。ロックを作成したプロセスが終了し、この問題を解決する方法がある場合、ファイルのロックが削除されない理由を教えてください。

+0

'man 2 flock'に記載されているすべての条件が満たされていますか?特に、開かれた状態でファイル記述子を保持しているforkされたプロセスがないことを確かめますか? (これをチェックするには 'lsof'または' fuser'を使用してください) – gudok

+0

@gudokフロックチェックの後、fork()を使って子プロセスを作成しています。しかし、これらのプロセスはこのファイルを使用していません。 – kadina

+0

私たちにコードを教えてください。私たちは見えないものをデバッグすることはできません。そして定義上、あなたはどこに問題があるのか​​分からないので、おそらく重要な点を除外しています。オープンした後で 'fork'すると、子プロセスはロックを解放する前にファイルを'閉じる '必要があります。 – kaylum

答えて

1

プロセスがクラッシュすると、ファイルディスクリプタが閉じられません。 群れドキュメント:https://linux.die.net/man/2/flock

ロックはこれらの重複した記述子のいずれかに明示的なLOCK_UN操作のいずれかによって解放され、またはそのようなすべての記述子が

このためのソリューションを待つことです

を閉じたときシグナル15(殺す)と何もしないでください。 http://en.cppreference.com/w/cpp/utility/program/signalhttp://en.cppreference.com/w/cpp/utility/program/signal

スレッドを実行したり、ファイルディスクリプタを閉じたり閉じたりすると(スレッドはメモリを共有します)、サーバーをスレッドとして実行できます。

+0

これは堅牢ではありません。プロセスがSIGKILLされても、それは役に立ちません。適切な解決策は@ IanM_Matrix1によって以前に言及されました。 – gudok

+0

@gudok correct。しかし、プロセスが予期せず終了した場合、アプリケーションがファイル記述子を閉じる機会を得る方法。 – kadina

+0

処理されたすべてのfork()は、親プロセスではなく、作成された直後にこのファイル記述子を閉じる必要があります。 – gudok

関連する問題