孤儿进程与僵尸进程
在操作系统中,孤儿进程(Orphan Process) 和 僵尸进程(Zombie Process) 是两种特殊的进程状态,它们通常与进程的生命周期和父子进程关系有关。
孤儿进程
(1)定义:孤儿进程是指 父进程已经终止,但子进程仍在运行 的进程。
(2)产生原因:父进程先于子进程终止。
操作系统会将孤儿进程的父进程设置为 init 进程(PID 为 1 的进程),由 init 进程负责回收孤儿进程的资源。
僵尸进程
(1)定义:僵尸进程是指子进程已经终止,但其父进程尚未回收其资源的进程。
(2)产生原因:子进程终止后,父进程没有调用 wait 或 waitpid 回收子进程的资源。子进程的进程描述符仍然保存在系统中,占用进程表项。
特点
孤儿进程:不会对系统造成危害,init进程会定期检查并回收孤儿进程的资源
僵尸进程:不占用CPU资源,但是会占用进程ID和进程表项,如果大量僵尸进程积累,会导致系统资源耗尽。
如何避免僵尸进程?
为了避免僵尸进程,父进程需要及时回收子进程的资源。
使用wait()函数
用于等待任意一个子进程终止,并回收其资源。
1 |
|
status:指向一个整数的指针,用于存储子进程的退出状态。如果不需要状态信息,可以传入 NULL。
返回值:
成功:返回终止的子进程的 PID。
失败:返回 -1,并设置 errno。
使用waitpid()函数
用于等待指定的子进程终止,并回收其资源。相比wait,waitpid提供了更多的控制选项。
1 |
|
pid:
$>$ 0:等待指定 PID 的子进程。
-1:等待任意子进程(类似于 wait)。
0:等待与调用进程同组的任意子进程。
$<$ -1:等待组 ID 等于 |pid| 的任意子进程。
status:指向一个整数的指针,用于存储子进程的退出状态。
options:控制函数行为的选项,常用的有:
WNOHANG:如果没有子进程终止,立即返回,而不是阻塞。
WUNTRACED:如果子进程被暂停,也返回。
返回值:
成功:返回终止的子进程的 PID。
失败:返回 -1,并设置 errno。