通常一个子进程终止后,需要父进程对其进行善后工作(获取子进程的结束状态,释放它仍占用的资源等等),wait系统调用就是干这件事。在子进程结束后,父进程还没有对它善后之前这段时间,这个子进程就是zombie process(僵死进程)。如果父进程无法wait子进程,怎样才能避免zombie呢?有两种办法:
捕获SIGCHLD信号。子进程正常或异常结束时,内核就会向其父进程发送SIGCHLD信号。所以我们可以这样设置这个信号的处理函数:
static void sigchld(int sig)
{
int rv;
do
rv = waitpid(0, NULL, WNOHANG);
while (rv > 0);
}
连续fork两次。子进程直接退出,孙子进程被init进程接管,所以就不用担心它会成为zombie了。
如何成为daemon进程
下面是从《Unix高级环境编程》摘过来的代码(Page 314):
static int daemon_init()
{
pid_t pid;
if((pid = fork()) <0)
return -1;
else if(pid !=0 )
exit(0); /* parent goes bye-bye */
/* child continues */
setsid(); /* become session leader */
chdir("/"); /* change working directory */
umask(0); /* clear our file mode creation mask */
return 0;
}