關於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 //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;

程序運行結果:

wKiom1ctkGaxo0fKAAAj3uugdJM997.png

分析:

   父打印10秒之後子打印,並且拿到子進程的退出碼。這樣的話父進程就可以專心處理自己的工作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章