系统相关
首页 > 系统相关> > linux 进程领养以及僵尸进程

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