捕捉SIGCHLD,处理僵死进程

在Linux/Unix系统中,当进程结束时,内核会释放进程占用的所有资源:占用的内存、打开的文件等,但是仍保留一些信息:进程ID、退出状态、运行时间,这些信息等着父进程来去(条用wait/waitpid),在父进程取走之前,子进程称为僵死进程。

为了防止僵死进程,父进程可以阻塞等待子进程结束,这是这样父进程就不能做自己的工作。

父进程也可以采用“轮询”的方式来调用wait/waitpid,但是这样设计程序可能会过于复杂。

子进程终止会给父进程发送SIGCHLD信号,父进程可以捕捉这个信号,在信号处理程序中条用wait/waitpid

#include<sys/types.h> 
#include<sys/wait.h> 
#include<unistd.h> 
#include<signal.h> 
#include<stdio.h>
/*信号处理函数*/ 
void sigHandler(int sig) 
{ 
	int stat; 
	wait(&stat); 
	if(WIFEXITED(stat))
 		printf("child process eixt code is %d\n",WEXITSTATUS(stat)); 
	else if(WIFEXITED(stat)) 
		printf("child process terminated abnormally, signal %d\n",WTERMSIG(stat)); 
}
void initSig() { 
	struct sigaction act; 
	act.sa_handler=sigHandler;//注册信号处理函数 
	sigemptyset(&act.sa_mask); 
	act.sa_flags=0; 
	sigaction(SIGCHLD,&act,NULL); 
	pause(); 
}
int main() 
{ 
	pid_t pid;
 	pid=fork();
 	if(pid==0){ 
		/*child*/ 
		sleep(5); 
		exit(2); 
	} 
	if(pid>0){ 
		/*parent*/ 
		initSig(); 
	} 
	return 0; 
}



你可能感兴趣的:(捕捉SIGCHLD,处理僵死进程)