7

私はかなり複雑なPythonプログラムを持っています。内部的には、排他的(LOCK_EX)を使用fcntl.flockしてグローバルロックを管理するロギングシステムがあります。事実上、ログメッセージがダンプされるたびに、グローバルファイルロックが取得され、メッセージがファイルに発行され(ロックファイルとは異なります)、グローバルファイルロックが解放されます。

プログラムはまた、(ログ管理が設定された後)それ自体を数回フォークします。一般的にすべてが機能します。

親プロセスが強制終了された場合(そして子が生きたままの場合)、デッドロックが発生することがあります。すべてのプログラムはfcntl.flock()永久にブロックされます。外部でロックを取得しようとすると、永久にブロックされます。私は問題を解決するために子供たちのプログラムを殺さなければなりません。

しかし、困惑しているのはlsof lock_file、ロックを保持するプロセスがないことです。そのため、ファイルがカーネルによってロックされている理由を理解できませんが、ファイルを保持していると報告されるプロセスはありません。

flockフォークに問題がありますか?死んだ親は、プロセステーブルに存在しなくなったにもかかわらず、どういうわけかロックを保持していますか?この問題を解決するにはどうすればよいですか?

4

1 に答える 1

3

lsofほぼ確実にロックが表示flock()されていないので、ロックが表示されていなくても、ロックがあるかどうかはわかりません。

flock()ロックはfd-sharing(dup()システムコール、またはファイルを開いたままにするfork-and-exec)を介して継承され、共有記述子を持っている人は誰でもロックをロック解除できますが、ロックがすでに保持されている場合は、再度ロックしようとするとブロックされます。したがって、はい、親が記述子をロックしてから死亡し、記述子がロックされたままになっている可能性があります。次に、記述子がすでにロックされているため、子プロセスもロックを試みてブロックします。(子プロセスがファイルをロックしてから死んだ場合も同じことが起こります。)

`fcntl()'ロックはプロセスごとであるため、死にかけているプロセスはすべてのロックを解放し、続行できるようにします。これがここで必要なことです。

于 2012-03-09T01:49:59.943 に答える