孤儿进程与僵尸进程_笔记

原文地址:http://www.cnblogs.com/Anker/p/3271773.html


在unix中,子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。

在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。 但是仍然为其保留一定的信息(包括进程号、退出状态、运行时间等)。直到父进程通过wait / waitpid来取时才释放。 


孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

僵尸进程:子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。


僵尸进程的危害如果进程不调用wait / waitpid的话, 么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 

然而,孤儿进程并不会有什么危害。


解决僵尸进程的两种方法:

1、子进程结束是发送SIGCHILD信号,父进程处理该信号在信号处理函数中调用wait。

 //创建捕捉子进程退出信号
13     signal(SIGCHLD,sig_child);

static void sig_child(int signo)
35 {
36      pid_t        pid;
37      int        stat;
38      //处理僵尸进程
39      while ((pid = waitpid(-1, &stat, WNOHANG)) >0)
40             printf("child %d terminated.\n", pid);
41 }

2、将子进程成为孤儿进程,从而其的父进程变为init进程,通过init进程可以处理僵尸进程




你可能感兴趣的:(孤儿进程与僵尸进程_笔记)