标签:linux 僵尸 0.0 领养 pid child 进程 include
父进程子进程结束不同步发生的问题:孤儿进程和僵尸进程
当父进程和子进程退出不同步的时候,会发生两种情况
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。