SIGCHLD信号就是由内核在任何一个进程终止时发给它的父进程的一个信号。
signal函数:
#include "unp.h"
Sigfunc * signal(int signo,Sigfunc *func)
{
struct sigactionact oact;
act.sa_handler = func;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
if(signo == SIGALRM){
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT;
#endif
} else {
#ifdef SA_RESTART
act.sa_flags |= SA_RESTART;
}
#endif
if( sigaction(signo,&act,&oact)<0)
return(SIG_ERR);
return (oact.sa_handler);
}
设置僵死状态的目的是维护子进程的信息,以便父进程在以后某个时候获取。这些信息包括子进程的进程ID,终止状态以及资源利用信息(CPU时间,内存使用量等等)。如果一个进程终止,而该进程有子进程处于僵死状态,那么它的所有僵死子进程的父进程ID将被重置我为1(init进程),继承这些子进程的init进程将清理它们。(也就是说init进程僵wait它们,从而去除它们的僵死状态)。
处理僵死进程
之前我们说到不愿意留存僵死进程,它会占用内核空间,最终可能导致资源耗尽。所以我们无论何时fork子进程时都要wait他们,以防止变成僵死进程。因此我们建立一个处理SIGCHLD信号的处理函数。