孤儿进程和僵尸进程

来源:互联网 发布:诱导交友app源码 编辑:程序博客网 时间:2024/05/17 19:18

1.孤儿进程

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

孤儿进程没什么危害

2.僵尸进程

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

3.僵尸进程的危害及其原因

unix提供了一种机制使得父进程可以知道子进程结束时的状态信息。这种机制就是: 在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。 但是仍然为其保留一定的信息(包括进程号,退出状态,运行时间等)。直到父进程通过wait / waitpid来取时才释放。但这样就导致了问题,如果进程不调用wait / waitpid的话, 么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果村咋大量的僵死进程,将导致系统因为没有可用的进程号而不能产生新的进程,所以应当避免僵尸进程。

4.如何清除僵尸进程进程

1)改写父进程,使其捕捉SIGCHLD信号并设置相应的处理函数。

注:子进程死后,会向它的父进程发送SIGCHLD信号,就算父进程没有调用wait()函数,内核也会向父进程发送SIGCHLD信号,不过对该信号的默认处理丢失忽略,所以需要重新设置该信号的处理函数。

2)杀死父进程。父进程死后,僵尸进程变为孤儿进程,由init进程接管,init进程始终会清理僵尸进程(init进程会wait()这些进程)。具体做法是两次fork,第一次fork创建一个子进程,然后在子进程中再次调用fork创建子进程,然后让第一个子进程退出(父进程调用wait())。那么,第二次调用fork创建的子进程就成为了孤儿进程,将由始终会清除僵尸进程的init进程接管,从而避免了僵尸进程的产生。


注:任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个 子进程在结束时都要经过的阶段。

0 0