如何避免产生僵死进程zombie process

通常一个子进程终止后,需要父进程对其进行善后工作(获取子进程的结束状态,释放它仍占用的资源等等),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;
}


 » 相关连接:
利用mktemp和fcntl实现进程间互斥 Linux环境进程间通信——信号 多进程编程 如何启动另一程序的执行exec
信号 互斥锁、条件变量 互斥锁的使用 创建线程
线程、全局变量、线程参数 POSIX线程编程指南
 » 本栏目最新帖:
 » 精华帖:

Powered by PHPWind v6.0 Code © 2003-08