信号でそれを制御することはできません。 waitpid()
を呼び出すことにより、その親プロセスのみがそれを制御できます または SIGCHLD
のシグナルハンドラを設定する . SIGCHLD
を参照 そして SA_NOCLDWAIT
sigaction(2)
で 詳細についてはマンページをご覧ください。
また、子スレッドがどうなるかは、Linux カーネルのバージョンによって異なります。 2.6 の POSIX スレッドでは、メイン スレッドを強制終了すると、他のスレッドが正常に終了するはずです。 2.4 LinuxThreads では、各スレッドは実際には個別のプロセスであり、SIGKILL
SIGTERM
に対して、ルート スレッドに他のスレッドにシャットダウンを指示する機会を与えません。
ルート プロセス (親プロセス) を強制終了すると、ゾンビの子ではなく、孤児の子が作成されます。プロセスの親を強制終了すると、孤児の子が作成され、カーネルは init を孤児の親にします。 init は orphan が死ぬまで待ってから、wait を使用してクリーンアップすることになっています。
プロセス (その親ではない) が終了し、その親がプロセス テーブルからその終了ステータスを取得しない場合、ゾンビの子が作成されます。
定義上、ゾンビの親プロセスを強制終了すると、ゾンビの子自体が死ぬため、孤児を残すことを心配しているように思えます。
孤児を殺すには、SIGKILL と同等の kill -9 を使用します。
Linux でものを殺すためのより詳細なチュートリアルは次のとおりです:http://riccomini.name/posts/linux/2012-09-25-kill-subprocesses-linux-bash/