您的位置首页百科词库

如何解决程序中存在僵尸进程问题

如何解决程序中存在僵尸进程问题

在后端开发中,经常查看进程信息时会发现有僵尸进程存在。僵尸进程是已经结束的进程,但是没有被父进程回收导致的。

因为系统中资源有限,不回收僵尸进程可能导致系统资源耗尽,所以我们必须解决处理僵尸进程。

为了后续讲解,我们编写一个程序例子。程序中接收用户输入,并创建子进程处理用户输入。

程序示例如下:

运行程序,再输入数据并获取处理结果之后,我们查看系统中进程,发现产生了僵尸进程。

僵尸进程产生的原因是因为子进程已经结束运行,但是父进程没有对其进行回收。

第一种方式:父进程创建了子进程之后,等待回收子进程资源。

优化程序后,我们再次执行并查看系统中进程,没有僵尸进程了。

父进程等待回收子进程资源时,父进程此时并没有充分利用起来,影响系统效率。

在子进程结束后,父进程会收到SIGCHLD信号,通过在父进程中设置信号处理函数,收到SIGCHLD信号后再执行回收操作。这样提高系统效率。

如果程序中不关心子进程是否结束,那么对于SIGCHLD信号,父进程设置为忽略。那么当子进程退出后,内核会将该进程回收。所以,忽略SIGCHLD信号也是一种处理方法。

最后,还有一种处理方法。父进程创建子进程并等待子进程退出,在子进程处理中,创建孙进程,子进程马上结束。

这样父进程等待子进程并不需要太久,而孙进程的父进程已经结束,孙进程的父进程将设置为init进程。孙进程结束后,由init系统进程对其进行回收。