捕捉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; 
}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值