C 语言中的僵尸进程和孤儿进程

2025年1月7日 | 阅读 4 分钟

在 C 编程中,进程是指令的执行。当您执行一个 C 程序时,它就会变成一个进程。在执行过程中,一个进程拥有自己的内存空间、资源和状态。它开始执行指令,然后退出。

操作系统通过分配资源(如 CPU 时间、内存和 I/O(输入/输出)硬件)来管理进程。在本文中,您将了解 C 语言中的僵尸进程和孤儿进程。

僵尸进程

僵尸进程已完成执行,但在进程表中仍有条目,需要向其父进程报告。子进程在从进程表中移除之前,总是会变成僵尸进程。父进程读取子进程的退出状态并从进程表中移除子进程的条目。

如果父进程未能运行 wait() 或 waitpid() 函数来收集其子进程的终止状态,则此类进程可能会排队,从而导致大量僵尸进程。这种僵尸进程的堆积会占用进程表条目等系统资源,尽管在大量僵尸进程未被使用之前,实际影响通常很小。

在以下代码中,子进程使用 exit() 系统调用完成其执行,而父进程休眠 40 秒,因此不调用 wait(),子进程的条目仍然保留在进程表中。

示例

这是使用 fork() 函数的示例程序。

孤儿进程

孤儿进程是即使其父进程已终止或完成执行后仍继续运行的子进程。当父进程在子进程之前死亡时,孤儿子进程就会被留下。

孤儿进程由 init 进程(通常 PID 为 1)接管,init 进程充当系统的祖先。init 进程接收孤儿进程并成为它们的新父进程。由于它们有一个替代父进程,该进程最终将在它们终止时收集其退出状态,因此孤儿进程被阻止变成僵尸进程。

孤儿进程通常在其父进程死亡后继续不受干扰地运行。但是,如果它们依赖于其父进程不再可用的某些资源或连接,它们可能会遇到问题。

示例

输出

The process of creating the Zombie process..
The parent process with PID: 7941
The parent process waits...
Execution of the child process.
Parent process is completed.

Creation of the Orphan process...
The parent process with PID: 7988
The parent process is terminated.
Child process executing and then sleeping for a while...
Child process completed.

The parent process is waits for all child processes
If all processes are completed. The parent process is exits