プロセスの終了について

ryichk
·

プロセスを終了させるにはexit_group()というシステムコールを呼ぶ。

Pythonではexit()関数を呼ぶと内部でexit_group()が呼び出される。

プログラム自身が呼ばなくてもlibcなどが内部的に呼び出している。

exit_group()関数の中で、カーネルはメモリなどのプロセスのリソースを回収する。

プロセスが終了した後は、親プロセスがwait()やwaitpid()といったシステムコールを呼び出すことで次のような情報を取得できる。

  • プロセスの戻り値

    (exit()関数の引数を256で割った余りに等しい。0~256を指定した場合は引数の値がそのまま戻り値となる)

  • シグナルによって終了したか否か

  • 終了までにどれくらいCPU時間を使ったか

この仕組みを使えば、例えばプロセスの戻り値によって「異常終了していた場合はエラーログを出力する」などの対処ができる。

bashの中からであれば、バックグラウンド実行したプロセスを内部的にwait()システムコールを呼び出すwait組み込みコマンドによって終了状態を得られる。

ゾンビプロセスと孤児プロセス

子プロセスは、終了しても親プロセスがwait()系システムコールを呼ぶまでゾンビプロセスと呼ばれる形で存在している。

親プロセスがwait()系システムコールを実行する前に終了した場合、子プロセスは孤児プロセスとなる。

カーネルはinitを孤児プロセスの新しい親にする。

initは定期的にwait()系システムコールを実行し、システムのリソースを回収している。

参照

[試して理解]Linuxのしくみ ―実験と図解で学ぶOS、仮想マシン、コンテナの基礎知識【増補改訂版】

@ryichk
wanna be a good hacker.