死进程,同时内核会向其父进程发送SIGCHLD(或SIGCLD)信号。此时要分几种情况:
1、父进程处理SIGCHLD信号,调用wait,僵死进程消失。这样我们就看不到僵尸进程。
2、父进程忽略SIGCHLD信号,随着子进程不断产生、结束,僵死进程的数目不断增加,导致影响系统速度及其他一些问题。
不需长期运行的程序,即使产生子进程也不会导致大量僵死进程存在。因为,父进程退出时,其产生的子进城成为“孤儿“进程,由init(1号进程)进程接管,init进程在子进程退出时会处理SIGCHLD信号,给子进程“收尸“。
/**
* A handler, which is called on child proccess exit.
*/
void sig_chld_handler(void) {
//other proccess
while (waitpid(-1, NULL, WNOHANG) > 0);
}
#ifdef __USE_GNU
signal(SIGCHLD, (sighandler_t )sig_chld_handler);
#endif
#ifdef __USE_BSD
signal(SIGCHLD, (sig_t )sig_chld_handler);
#endif
signal返回值: 返回先前的信号处理函数指针,如果有错误则返回SIG_ERR(-1)。
SIGCHLD 进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。缺省情况下该Signal会被忽
略
下面的情况可以产生Signal:
1. 按下CTRL+C产生SIGINT
2. 硬件中断,如除0,非法内存访问(SIGSEV)等等
3. Kill函数可以对进程发送Signal
4. Kill命令。实际上是对Kill函数的一个包装
5. 软件中断。如当Alarm Clock超时(SIGURG),当Reader中止之后又向管道写数据(SIGPIPE),等等