核心句子
子進程在終止時會給父進程發SIGCHLD信號,該信號的默認處理動作是忽略,父進程可以自 定義SIGCHLD信號的處理函數。
僵尸進程的產生:
#include "head.h"
#include <unistd.h>
#include <signal.h>int main()
{key_t key = ftok(".",1);pid_t pid = fork();if( pid > 0){while(1){printf("I am father\n");sleep(1);}}else if(pid == 0)printf("I am child\n");elseperror("fork()");
}
優先選擇#ps -lA | grep a.out
SIGCHLD建立信號處理程序
當SIGCHLD信號正在處理一個終止的子進程時,如果有兩個子進程同時終止,那么就產生了兩個SIGCHLD信號,父進程只可以捕獲一個。
結果是父進程的SIGCHLD信號處理程序每次只調用一次wait()。這樣就一定會產生僵尸進程
使用for循環產生10個子進程,十個子進程都是僵尸進程
#include "head.h"
#include <unistd.h>
#include <signal.h>int handler(int s)
{wait();
}int main()
{key_t key = ftok(".",1);signal(SIGCHLD,handler);int i ;for(i = 0;i<10;i++){pid_t pid = fork();if (pid == 0){printf("i am child\n");sleep(1);exit(0);}else if(pid < 0)perror("fork():");}while(1){printf("讓程序在這里死循環,然后觀察后臺進程\n");sleep(1);}
}
處理方案
int handler(int s)
{while(waitpid(-1,NULL,WNOHANG) > 0){continue; }
}
關于waitpid () 和 wait()的解釋請看下一篇博客