参考该文。
在调用fork()执行后,可能会产生孤儿进程和僵尸进程,让我们一起看看到底什么是孤儿进程和僵尸进城以及怎么解决他们。
一、孤儿进程:
父进程结束, 子进程依旧存在。 那么子进程就被称为孤儿进程。 系统会将所有的孤儿进程挂载到 init 下。 init 进程的 pid = 1
通过ps aux 查看,可以看到孤儿进程的父进程号为1.
二、僵尸进程:
1、进程结束, 但是 PCB 没释放
2、子进程结束, 父进程未结束, 并且父进程未获取子进程的退出状态
三、处理僵尸进程方法:
1、 结束其父进程:这样子进程就由init进程接管。
2、 父进程获取子进程的退出状态: 在父进程中调用wait()函数,但是wait 函数会阻塞运行, 直到第一个子进程退出。
#include#include #include int main() { int data = 100; pid_t pid; pid = fork(); if(pid<0) { perror("fork()"); }else if(pid == 0){ printf("child"); //子进程 data += 100; }else{ printf("father"); //父进程 } printf("data = %dn",data); return 0; }
3、在子进程结束时,子进程给父进程发一个信号(告知父进程我已经结束了)父进程接收到信号后在对子进程做处理。即:信号17 SIGCHID。



