僵尸进程与孤儿进程

僵尸进程

  • 僵尸进程是已经终止执行的进程,但其父进程尚未对它进行善后处理(即收回其资源和终止它)的状态。
  • 当一个进程终止时,内核会向其父进程发送一个信号,告知其子进程的终止状态,父进程需要调用 wait 或 waitpid 等系统调用来获取子进程的终止状态信息。
  • 如果父进程没有调用这些系统调用来处理子进程的终止状态,那么子进程就会成为僵尸进程,其进程描述符仍然存在于系统中,但不再执行任何代码
  • 僵尸进程占用了系统资源,需要及时被清理

孤儿进程

  • 孤儿进程是指其父进程已经终止或不存在,而它的一个或多个子进程还在运行,那么这些子进程就成为孤儿进程(father died)。
  • 子进程的资源由init进程(进程号PID = 1)回收

僵尸进程与孤儿进程的区别

  • 僵尸进程仍然有一个父进程,但父进程未能及时处理子进程的终止状态;而孤儿进程没有父进程或其父进程已经终止
  • 僵尸进程的进程描述符仍然存在于系统中,占用了系统资源;而孤儿进程的进程描述符会被 init 进程接管,不会占用系统资源
  • 僵尸进程需要父进程调用 wait 或 waitpid 等系统调用来释放其资源;而孤儿进程则由 init 进程负责善后处理,释放其资源。

僵尸进程的处理

1.父进程使用 waitwaitpid 系统调用:

  • 父进程可以使用 wait 或 waitpid 系统调用来等待子进程的终止并获取其终止状态信息。
  • 这些系统调用会阻塞父进程,直到有子进程终止为止。
  • 当父进程调用这些系统调用后,内核会回收僵尸进程的资源,并从系统中移除该进程。

2.父进程捕获 SIGCHLD 信号:

  • 父进程可以通过捕获 SIGCHLD 信号来处理子进程的终止状态。
  • 当父进程收到 SIGCHLD 信号时,可以调用 wait 或 waitpid 系统调用来获取子进程的终止状态。
  • 在信号处理函数中,可以执行相应的清理操作,包括回收子进程的资源。

3.使用 SIG_IGN 忽略 SIGCHLD 信号:

  • 父进程可以通过将 SIGCHLD 信号的处理方式设置为 SIG_IGN(忽略)来告知内核,父进程对子进程的终止状态不感兴趣。
  • 这样,当子进程终止时,内核会自动处理僵尸进程的资源回收。
  • 但需要注意,这种方法只适用于父进程对子进程终止状态不关心的情况。

你可能感兴趣的:(Linux系统,linux,服务器,运维)