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 //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秒之后子打印,并且拿到子进程的退出码。这样的话父进程就可以专心处理自己的工作。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。