您好,登錄后才能下訂單哦!
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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。