孤儿进程和僵尸进程 | 小牛学习日记
孤儿进程和僵尸进程
Published in:2025-02-23 | category: C++
Words: 632 | Reading time: 2min | reading:

孤儿进程与僵尸进程

在操作系统中,孤儿进程(Orphan Process) 和 僵尸进程(Zombie Process) 是两种特殊的进程状态,它们通常与进程的生命周期和父子进程关系有关。

孤儿进程

(1)定义:孤儿进程是指 父进程已经终止,但子进程仍在运行 的进程。

(2)产生原因:父进程先于子进程终止。

操作系统会将孤儿进程的父进程设置为 init 进程(PID 为 1 的进程),由 init 进程负责回收孤儿进程的资源。

僵尸进程

(1)定义:僵尸进程是指子进程已经终止,但其父进程尚未回收其资源的进程。

(2)产生原因:子进程终止后,父进程没有调用 wait 或 waitpid 回收子进程的资源。子进程的进程描述符仍然保存在系统中,占用进程表项。

特点

孤儿进程:不会对系统造成危害,init进程会定期检查并回收孤儿进程的资源

僵尸进程:不占用CPU资源,但是会占用进程ID和进程表项,如果大量僵尸进程积累,会导致系统资源耗尽。

如何避免僵尸进程?

为了避免僵尸进程,父进程需要及时回收子进程的资源。

使用wait()函数

用于等待任意一个子进程终止,并回收其资源。

1
2
3
#include <sys/wait.h>

pid_t wait(int* status);

status:指向一个整数的指针,用于存储子进程的退出状态。如果不需要状态信息,可以传入 NULL。

返回值

成功:返回终止的子进程的 PID。

失败:返回 -1,并设置 errno。

使用waitpid()函数

用于等待指定的子进程终止,并回收其资源。相比wait,waitpid提供了更多的控制选项。

1
2
3
#include <sys/wait.h>

pid_t waitpid(pid_t pid, int* status, int options);

pid

$>$ 0:等待指定 PID 的子进程。

-1:等待任意子进程(类似于 wait)。

0:等待与调用进程同组的任意子进程。

$<$ -1:等待组 ID 等于 |pid| 的任意子进程。

status:指向一个整数的指针,用于存储子进程的退出状态。

options:控制函数行为的选项,常用的有:

WNOHANG:如果没有子进程终止,立即返回,而不是阻塞。

WUNTRACED:如果子进程被暂停,也返回。

返回值

成功:返回终止的子进程的 PID。

失败:返回 -1,并设置 errno。

Next:
信号相关函数
Prev:
进程创建常用函数