0

私はそのように動作するマルチプロセスアプリケーションを持っています...

親プロセスがあります。親プロセスはデータベースにクエリを実行して作業を見つけ、その作業を処理するために子プロセスをフォークします。子は、System V メッセージ キューを介して親に通信し、作業が完了したことを示します。親プロセスがそのメッセージを受け取ると、データベースを更新して作業が完了したことを示します。

これは問題なく動作しますが、親プロセスが強制終了されるのを処理するのに苦労しています。

親が (CTRL-C から) SIGINT を受け取り、次にそれぞれの子に SIGKILL を送信します。子がそのシグナルを受信したときに現在 Sys V メッセージ キューの書き込みをブロックしている場合、書き込みはシグナルによって「中断」され、ブロックはキャンセルされ、親は子の作業が完了したことを知ることはなく、データベースが更新されることもありません。 .

これは、次にスクリプトを実行するときに、System V キューの書き込みでブロックされていたすべての作業を再実行することを意味します。

これを解決する良いアイデアはまだありません。理想的には、その SIGKILL を受信した場合でも、キューの書き込みを強制的にブロックしたままにできるようにしたいと考えていますが、そのようなことは可能ではないと思います。

4

1 に答える 1

0

井戸SIGKILLは、定義上、それを受け取ったプロセスにとって即座に致命的であり、トラップまたは処理することはできません。

そのため、プロセスがより丁寧なシャットダウン要求に応答しない場合にのみ、最後の手段として使用する必要があります。親プロセスは、SIGINTorのようなものを子に送信することから始め、適切な時間内に終了しない場合にSIGTERMのみにリセットする必要があります。SIGKILL

SIGINTやのようなシグナルSIGTERMは、子のシステム コールを で返すEINTR可能性がありますが、それを処理して呼び出しを再試行し、終了する前に完了させることができます。

于 2013-01-22T22:40:11.267 に答える