私はPOSIXシグナル処理とジョブ制御を適切にエミュレートしようとしています私のお気に入りのオペレーティングシステムしかし、セッション リーダーが終了した後にセッションがどうなるかはわかりません。
たとえば、複数のバックグラウンド プロセスと別のフォアグラウンド プロセスが実行されているときに、子プロセスがセッション リーダーを強制終了した場合に、セッションとそのプロセスに何が起こるかに関するドキュメントが見つかりません。
私のテストでは、セッション内のすべてのプロセスが強制終了されることが示されていますが、どのようにでしょうか?
特定のシグナルを受信しているのでしょうか?
このケースは POSIX 標準で指定されていますか? もしそうなら、参考資料を提供できますか?
答え1
POSIXセッションに困惑しているのはあなただけではありません。Lennart Poettering(systemd
有名な人物)困惑している。
誰もが知る限り、セッションリーダーが死ぬと、init
孤立したセッションを継承し、
フォアグラウンド プロセス グループ内のすべてのセッション メンバー プロセス (存在する場合) は SIGHUP を受信します。
フォアグラウンド グループにないセッション メンバー プロセスは、シグナルを受信しません。
参照:
- notes.shichao.io/apue/ch9
- 第10章プロセス" で Linuxカーネルアンドリース・ブラウワー著(2003年)。
端末がモデムのハングアップによって切断され、回線がローカルでなかった場合、SIGHUP がセッション リーダーに送信されます。 [...] セッション リーダーが終了すると、フォアグラウンド プロセス グループ内のすべてのプロセスに SIGHUP が送信されます。 [...] したがって、端末が切断され、セッション リーダーがジョブ制御シェルである場合、その子孫に対して、たとえば SIGHUP を再度送信するなどして処理を行うことができます。一方、セッション リーダーが SIGHUP をキャッチしない無害なプロセスである場合、そのセッション リーダーは終了し、すべてのフォアグラウンド プロセスに SIGHUP が送信されます。
アンドリース・ブラウワー、Linuxカーネル、セクション10.3 "セッション「」。