孤儿进程和僵尸进程是操作系统中两种不同的进程状态,它们有着不同的特征和产生原因。
1. 孤儿进程:
- 孤儿进程是指父进程退出或意外终止后,子进程仍然在操作系统中运行的情况。由于子进程的父进程已经不存在,操作系统将其托付给init进程(在Unix/Linux系统中是进程号为1的init进程)。
- 孤儿进程不会占用系统资源,因为它们会被init进程接管,init进程负责回收孤儿进程的资源,并且将其状态更新为僵尸进程或者终止掉。
2. 僵尸进程:
- 僵尸进程是指一个进程已经结束了,但是其父进程还没有调用wait()或waitpid()等系统调用来获取子进程的终止状态,导致子进程的进程描述符仍然存在于进程表中,这种进程称为僵尸进程。
- 僵尸进程会占用系统资源,虽然它们不再执行任何代码,但是它们的进程描述符和部分资源仍然被操作系统所占用。
- 如果父进程不处理僵尸进程,大量僵尸进程可能会积累导致系统资源耗尽。
总的来说,孤儿进程是指没有父进程的子进程,由init进程接管;而僵尸进程是指已经结束但是其父进程尚未处理的进程,导致其进程描述符未被释放。在编写程序时,应该注意处理子进程的终止状态,避免产生僵尸进程。
#include <iostream>
#include <unistd.h>
int main() {
pid_t pid = fork(); // 创建子进程
if (pid == 0) { // 子进程
std::cout << "子进程正在运行\n";
// 子进程立即退出
_exit(0);
} else if (pid > 0) { // 父进程
std::cout << "父进程正在运行,子进程ID为:" << pid << "\n";
// 父进程不等待子进程,直接退出
//wait(nullptr); 这个函数表示阻塞并等待子进程退出 如果 不执行这条语句,将会创建僵尸进程
} else { // fork()失败
std::cerr << "fork()失败\n";
return 1;
}
return 0;
}