关于SIGCHLD 信号
1.关于SIGCHLD 信号
wait 和 waitpid函数清理僵尸进程,父进程可以阻塞等待子进程结束,也可以阻塞地查询是否有进程结束等待清理(也就是轮询的方式)。采用第一种方式,父进程阻塞就不能处理自己的工作了。采用第二种方式,父进程在处理自己的工作时还记得时不时轮询一下,程序实现复杂。其实子进程在终止时会给父进程发SIGCHLD信号,该信号的默认处理是忽略。父进程可以子定义SIGCHLD函数,这样父进程只需专心的处理自己的工作,不必关心子进程了。子进程终止时会通知父进程,父进程在信号处理函数中调wait清理子进程即可。
下面实现这样的的一个例子:
父进程fork出子进程,子进程调exit(1)终止,父进程自定义SIGCHLD信号的处理函数,在其中调wait获得子进程的退出状态并打印。
1#include<stdio.h>2#include<signal.h>3#include<unistd.h>4#include<stdlib.h>5#include<sys/wait.h>6//voidhandler(intsig)7//{89//printf("getasig:%d\n",sig);10//}1112voidclear_child(intsig)13{14intstatus=0;15while((waitpid(-1,&status,WNOHANG))>0)16{1718printf("sig:%d,code:%d\n",status&0xff,(status>>8)&0xff);19}20}2122intmain()23{2425pid_tpid=fork();26if(pid<0)27{28printf("forkfailed.....\n");29}30elseif(pid==0)31{32sleep(10);33printf("childisquit!...\n");34exit(2);35}36else37{38signal(SIGCHLD,clear_child);39printf("fatherstarttowait...\n");40while(1)4142{;}43}44return0;
程序运行结果:
分析:
父打印10秒之后子打印,并且拿到子进程的退出码。这样的话父进程就可以专心处理自己的工作。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。