exit

プロセスの終了はdo_exit関数で行われる。明示的にexitシステムコールを呼び出したとき以外にも、シグナルを受けて死ぬときなどにも呼び出される。do_exit関数ではtask_structを除く全ての資源の解放を行う。do_exitはexit_notify関数で親プロセスにSIGCHLDを送出する。SIGCHLDを受け取った親プロセスは、ZOMBIE状態になった子プロセスを探し出しtask_structの解放を行う。

do_exit(終了コード)
{
        このプロセス用のタイマを止める(del_timer関数)
        IPCセマフォの解放(sem_exit関数)
        仮想空間の解放(__exit_mm関数)
        ファイルのクローズと管理域の解放(__exit_files関数)
        カレントディレクトリ、umask情報の解放(__exit_fs関数)
        シグナルの破棄と管理領域の解放(__exit_sighand関数)
        プロセス状態をTASK_ZOMBIEに変更する
        親プロセスへの通知(exit_notify関数)
        CPUの放棄(schedule関数)
}

親プロセスは、以下のrelease関数を用いてZOMBIEとなったtask_struct構造体の解放を行う。

release(ZOMBIEの子プロセス)
        タスク登録テーブルのスロットを開放(add_free_taskslot関数)
        プロセスidの解放(unhash_pid関数)
        task_structの解放(free_task_struct解放)

(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST
1