首先,设置SIGCHLD的handler为SIG_IGN能否避免僵尸进程呢?
man signal,有以下解释:
According to POSIX (3.3.1.3) it is unspecified what happens when
SIGCHLD is set to SIG_IGN. Here the BSD and SYSV behaviours differ,
causing BSD software that sets the action for SIGCHLD to SIG_IGN to
fail on Linux.
避免僵尸进程通常有以下3种方法:
1. fork两次,使得孙子进程的父亲为init,孙子进程去执行job
(init进程只要检测有子进程终止就会调用wait或waitpid释放资源,防止僵尸进程。)
2. 制定自己的SIGCHLD信号处理函数,在这个信号处理函数中调用wait()
3. 通过sigaction系统调用指定信号SIGCHLD处理动作中的sa_flags为SA_NOCLDWAIT