在Linux kernel
中,在进程终止后,通过调用process descriptor
函数从系统中删除进程的release_task()
。
我相信,父进程在子进程上发出的wait()
系统调用在子进程终止时调用release_task()
函数。
假设父进程没有显式发出wait()
系统调用,如何调用release_task()
函数并解除分配子进程的进程描述符?
答案 0 :(得分:3)
如果父进程没有wait(2)
子进程,则该子进程为zombie
。只要父母生活,孩子就无法收获。当父母去世时,他所有未等待的孩子都被init
收养。 init
的一项工作是定期等待孩子(从而释放相关资源)
答案 1 :(得分:0)
release_task()函数从僵尸进程的描述符中分离出最后的数据结构;它以两种可能的方式应用于僵尸进程:如果父对象不接收来自孩子的信号,则通过 do_exit()函数,或者通过 wait4()或 waitpid()系统调用。在后一种情况下,该函数还将回收进程描述符使用的内存,而在前一种情况下,内存回收将由调度程序完成,因为 do_exit()调用 schedule( )在最后一步。
有关详细信息,请参阅本书 - 了解Linux内核:I / O端口和进程管理。