@TOC

前言

当谈到进程管理时,了解以下进程是很重要的:僵尸进程(Zombie Process),孤儿进程(Orphan Process),守护进程(Daemon Process)。


一、守护进程

Daemon 守护进程, 是 Linux 中的后台服务进程,通常独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。

创建守护进程最关键的是 调用 setsid 函数创建一个新的 Session,并成为 Session Leader.

创建守护进程的流程可以分为以下几个步骤:

  1. 创建子进程,父进程退出。
  2. 调用 setsid 函数在子进程中创建新对话。 (子进程独立出来,脱离控制)
  3. 改变当前目录

二、孤儿进程

孤儿进程是指其父进程已经退出或终止,而它的子进程尚未退出或终止的进程。在这种情况下,孤儿进程将被init进程(进程ID为1)接管,成为init进程的子进程。

init进程对孤儿进程进行回收处理,以释放它们占用的系统资源,并确保它们的退出状态被正确处理。这样可以防止孤儿进程变成僵尸进程。

孤儿进程通常是由于父进程意外终止或父进程没有正确等待子进程的退出状态而产生。

三、僵尸进程

  1. 什么是僵尸进程?

僵尸进程 是一个进程 fork( ) 创建子进程,当子进程退出时,父进程未使用 wait 或 waitpid 函数回收子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程叫做僵死进程。

  1. 僵尸进程的危害

在进程退出的时候,内核释放该进程的所有资源,包括打开的文件,占用的内存等。但是仍然保留一定的信息(pid, 进程状态等),直父进程使用 wait / waitpid 来回收进程时才释放。

如果不回收进程,那么信息就一直未被释放,进程号一直会被占用。而系统的进程号是一定的,大量的僵尸进程就会导致没有进程号来创建新进程。

  1. 如何清理僵尸进程?

当系统中出现了僵尸进程时,我们是无法通过 kill 命令把它清除掉的。kill -9 pid 但是我们可以杀死它的父进程,让它变成孤儿进程,并进一步被系统中管理孤儿进程的进程收养并清理。


总结

这些概念在进程管理中具有重要意义。了解僵尸进程、孤儿进程和守护进程的特点和处理方法有助于编写更健壮的多进程应用和系统。