僵尸进程
- 僵尸进程是已经终止执行的进程,但其父进程尚未对它进行善后处理(即收回其资源和终止它)的状态。
- 当一个进程终止时,内核会向其父进程发送一个信号,告知其子进程的终止状态,父进程需要调用
wait
或waitpid
等系统调用来获取子进程的终止状态信息。 - 如果父进程没有调用这些系统调用来处理子进程的终止状态,那么子进程就会成为僵尸进程,其进程描述符仍然存在于系统中,但不再执行任何代码。
- 僵尸进程占用了系统资源,需要及时被清理
孤儿进程
- 孤儿进程是指其父进程已经终止或不存在,而它的一个或多个子进程还在运行,那么这些子进程就成为孤儿进程(father died)。
- 子进程的资源由init进程(进程号PID = 1)回收。
僵尸进程与孤儿进程的区别
- 僵尸进程仍然有一个父进程,但父进程未能及时处理子进程的终止状态;而孤儿进程没有父进程或其父进程已经终止。
- 僵尸进程的进程描述符仍然存在于系统中,占用了系统资源;而孤儿进程的进程描述符会被 init 进程接管,不会占用系统资源。
- 僵尸进程需要父进程调用
wait
或waitpid
等系统调用来释放其资源;而孤儿进程则由 init 进程负责善后处理,释放其资源。
僵尸进程的处理
1.父进程使用 wait
或 waitpid
系统调用:
- 父进程可以使用
wait
或waitpid
系统调用来等待子进程的终止并获取其终止状态信息。- 这些系统调用会阻塞父进程,直到有子进程终止为止。
- 当父进程调用这些系统调用后,内核会回收僵尸进程的资源,并从系统中移除该进程。
2.父进程捕获 SIGCHLD
信号:
- 父进程可以通过捕获
SIGCHLD
信号来处理子进程的终止状态。- 当父进程收到
SIGCHLD
信号时,可以调用wait
或waitpid
系统调用来获取子进程的终止状态。- 在信号处理函数中,可以执行相应的清理操作,包括回收子进程的资源。
3.使用 SIG_IGN
忽略 SIGCHLD
信号:
- 父进程可以通过将
SIGCHLD
信号的处理方式设置为SIG_IGN
(忽略)来告知内核,父进程对子进程的终止状态不感兴趣。- 这样,当子进程终止时,内核会自动处理僵尸进程的资源回收。
- 但需要注意,这种方法只适用于父进程对子进程终止状态不关心的情况。