linux 进程领养以及僵尸进程
作者:互联网
父进程子进程结束不同步发生的问题:孤儿进程和僵尸进程
当父进程和子进程退出不同步的时候,会发生两种情况
1.父进程先退出,子进程未退出,被领养
此时,子进程将被init初始进程领养。如下面的代码:
a.c
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
int main(){
pid_t pid = fork();
if(pid>0){
printf("parent pid is:%d ,child pid is:%d", getpid(),pid);
}else{
while(1) sleep(1);
printf("child died");
}
return 0;
}
输出:parent pid is:2927 ,child pid is:2928
ps -aux查看该进程状态,
lsx 2928 0.0 0.0 2356 76 pts/0 S 11:38 0:00 ./a
此时只有一个./a进程,父进程已经退出 子进程依旧在运行,且运行状态为S,斌不是僵尸进程。
2.子进程先退出,父进程依旧运行,则子进程变为僵尸进程
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
int main(){
pid_t pid = fork();
if(pid>0){
printf("parent pid is:%d ,child pid is:%d", getpid(),pid);
while(1) sleep(1);
}else{
printf("child died");
exist(0);
}
return 0;
}
输出结果是:
parent pid is:1784 ,child pid is:1785
child died
使用ps -aux查看进程
lsx 1784 0.0 0.0 2488 516 pts/0 S+ 12:45 0:00 ./a 父进程依旧运行
lsx 1785 0.0 0.0 0 0 pts/0 Z+ 12:45 0:00 [a] <defunct> 子进程为僵尸进程z+ <defunct>
避免僵尸进程
让僵尸进程的父进程来回收,父进程每隔一段时间来查询子进程是否结束并回收,调用wait()或者waitpid(),通知内核释放僵尸进程。采用信号SIGCHLD通知处理,并在信号处理程序中调用wait函数。让僵尸进程成为孤儿进程,由init进程回收。
标签:linux,僵尸,0.0,领养,pid,child,进程,include 来源: https://www.cnblogs.com/lsxkugou/p/14183435.html