LINUX 通过fork创建子进程时,如果子进程退出,内核会向父进程发送SIGCHLD信号,这样由父进程回收子进程的资源,避免产生僵尸进程,
产生僵尸进程的本质是该进程的内核资源未被释放,本着谁创建谁释放的原则,则是父进程释放,所以需要在父进程处理SIGCHLD信号。
一般代码如下:
signal(SIGCHLD, OnSignalSIGCHLD);
static void OnSignalSIGCHLD(int signo)
{
pid_t pid;
int status = 0;
pid = waitpid( -1, &status, 0);
}
单如果在处理OnSignalSIGCHLD同时,又产生了多个SIGCHLD信号,则有些信号会忽略,因为linux信号不排队,以最后一个为主。
这样如果父进程fork了 多个子进程,子进程同时退出。则可能存在多个SIGCHLD信号同时产生,用以上的信号处理就会出现僵尸进程。
合理的做法应该是
static void OnSignalSIGCHLD(int signo)
{
pid_t pid;
int status = 0;
while ((pid = waitpid( -1, &status, WNOHANG))>0)//WNOHANG避免阻塞
{
//do my code
}
}