私はそのように動作するマルチプロセスアプリケーションを持っています...
親プロセスがあります。親プロセスはデータベースにクエリを実行して作業を見つけ、その作業を処理するために子プロセスをフォークします。子は、System V メッセージ キューを介して親に通信し、作業が完了したことを示します。親プロセスがそのメッセージを受け取ると、データベースを更新して作業が完了したことを示します。
これは問題なく動作しますが、親プロセスが強制終了されるのを処理するのに苦労しています。
親が (CTRL-C から) SIGINT を受け取り、次にそれぞれの子に SIGKILL を送信します。子がそのシグナルを受信したときに現在 Sys V メッセージ キューの書き込みをブロックしている場合、書き込みはシグナルによって「中断」され、ブロックはキャンセルされ、親は子の作業が完了したことを知ることはなく、データベースが更新されることもありません。 .
これは、次にスクリプトを実行するときに、System V キューの書き込みでブロックされていたすべての作業を再実行することを意味します。
これを解決する良いアイデアはまだありません。理想的には、その SIGKILL を受信した場合でも、キューの書き込みを強制的にブロックしたままにできるようにしたいと考えていますが、そのようなことは可能ではないと思います。