十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
1.关于SIGCHLD 信号
成都创新互联公司专注于企业成都全网营销推广、网站重做改版、花山网站定制设计、自适应品牌网站建设、成都h5网站建设、商城网站定制开发、集团公司官网建设、成都外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为花山等各大城市提供网站开发制作服务。
wait 和 waitpid函数清理僵尸进程,父进程可以阻塞等待子进程结束,也可以阻塞地查询是否有进程结束等待清理(也就是轮询的方式)。采用第一种方式,父进程阻塞就不能处理自己的工作了。采用第二种方式,父进程在处理自己的工作时还记得时不时轮询一下,程序实现复杂。其实子进程在终止时会给父进程发SIGCHLD信号,该信号的默认处理是忽略。父进程可以子定义SIGCHLD函数,这样父进程只需专心的处理自己的工作,不必关心子进程了。子进程终止时会通知父进程,父进程在信号处理函数中调wait清理子进程即可。
下面实现这样的的一个例子:
父进程fork出子进程,子进程调exit(1)终止,父进程自定义SIGCHLD信号的处理函数,在其中调wait获得子进程的退出状态并打印。
1 #include2 #include 3 #include 4 #include 5 #include 6 //void handler(int sig) 7 //{ 8 9 // printf("get a sig:%d\n",sig); 10 //} 11 12 void clear_child(int sig) 13 { 14 int status=0; 15 while((waitpid(-1,&status,WNOHANG))>0) 16 { 17 18 printf("sig:%d, code:%d\n",status&0xff,(status>>8)&0xff); 19 } 20 } 21 22 int main() 23 { 24 25 pid_t pid=fork(); 26 if(pid<0) 27 { 28 printf("fork failed.....\n"); 29 } 30 else if(pid==0) 31 { 32 sleep(10); 33 printf("child is quit!...\n"); 34 exit(2); 35 } 36 else 37 { 38 signal(SIGCHLD,clear_child); 39 printf("father start to wait...\n"); 40 while(1) 41 42 {;} 43 } 44 return 0;
程序运行结果:
分析:
父打印10秒之后子打印,并且拿到子进程的退出码。这样的话父进程就可以专心处理自己的工作。