


在UNIX系统中,僵尸进程是指执行完成(由退出系统调用或运行时期间接收到的致命错误或终止信号引起),但是操作系统的进程表(进程中仍存在一个条目)控制块PCB),处于“终止状态”过程. 当子进程需要保留条目以允许其父进程读取子进程的退出状态时,就会发生这种情况: 一旦通过wait系统调用读取了退出状态,僵尸进程条目就会从进程表中删除,这称为在正常情况下,该进程直接由其父进程等待并由系统回收. 通常,使进程长时间处于僵尸状态并导致资源泄漏是错误的.

英语中的僵尸进程一词来自en: 僵尸—不死族僵尸程序,一个比喻是子进程已死,但仍未收获. 与普通进程不同,kill命令对僵尸进程无效. 孤立过程不同于僵尸过程. 它的父进程已经死了,但是孤立进程仍然可以正常执行,但是它不会成为僵尸进程,因为它被init(进程ID号为1)采用并等待其退出.

子进程死亡后,系统将向父进程发送SIGCHLD信号,默认情况下,父进程会忽略该信号. 如果要响应此消息,则父进程通常使用SIGCHLD信号事件处理程序中的wait系统调用来响应子进程的终止.

收集僵尸进程后,系统可以重新使用其进程号(PID)和进程表中的条目. 但是,如果父进程不调用wait,则僵尸进程将保留进程表中的条目僵尸程序,从而导致资源泄漏. 在某些情况下,这是预料之中的: 父进程创建另一个子进程,并希望使用其他进程号. 如果父进程通过将事件处理函数设置为SIG_IGN而不是隐式忽略该信号来显式忽略SIGCHLD信号,或者具有SA_NOCLDWAIT标志,则所有子进程退出状态信息将被丢弃并由系统直接恢复.
UNIX命令ps列出的进程的状态(“ STAT”)标记为“ Z”,这是一个僵尸进程.
收集僵尸进程的方法是通过kill命令将SIGCHLD信号手动发送到其父进程. 如果父进程仍然拒绝收割僵尸进程,则终止父进程,而初始化进程采用僵尸进程. 初始化进程会定期执行wait系统调用,以收集其采用的所有僵尸进程.
为了避免僵尸进程,实际应用中常用的方法是:
将父进程中SIGCHLD信号的处理功能设置为SIG_IGN(忽略该信号);两次分叉并杀死第一级子进程,使第二级子进程成为孤立进程,并被init“采用”并清除
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-230198-1.html
一国两制行不通了
更不能剥夺狗叫的权利