プロセスを終了させるにはexit_group()というシステムコールを呼ぶ。
Pythonではexit()関数を呼ぶと内部でexit_group()が呼び出される。
プログラム自身が呼ばなくてもlibcなどが内部的に呼び出している。
exit_group()関数の中で、カーネルはメモリなどのプロセスのリソースを回収する。
プロセスが終了した後は、親プロセスがwait()やwaitpid()といったシステムコールを呼び出すことで次のような情報を取得できる。
プロセスの戻り値
(exit()関数の引数を256で割った余りに等しい。0~256を指定した場合は引数の値がそのまま戻り値となる)
シグナルによって終了したか否か
終了までにどれくらいCPU時間を使ったか
この仕組みを使えば、例えばプロセスの戻り値によって「異常終了していた場合はエラーログを出力する」などの対処ができる。
bashの中からであれば、バックグラウンド実行したプロセスを内部的にwait()システムコールを呼び出すwait組み込みコマンドによって終了状態を得られる。
ゾンビプロセスと孤児プロセス
子プロセスは、終了しても親プロセスがwait()系システムコールを呼ぶまでゾンビプロセスと呼ばれる形で存在している。
親プロセスがwait()系システムコールを実行する前に終了した場合、子プロセスは孤児プロセスとなる。
カーネルはinitを孤児プロセスの新しい親にする。
initは定期的にwait()系システムコールを実行し、システムのリソースを回収している。