关于僵尸进程
其实百度百科里已经解释的很清楚了,我这里总结一下:
简单来说,僵尸进程就是进程死掉了,爹娘(父进程)不管了,政府(init进程)也不管了!
这里要说明一下:政府还是很好的,如果爹娘没了(父进程结束),政府会接管孩子;如果爹娘还在,政府是不管孩子死活的。僵尸进程,就是爹娘还在,又不管孩子,政府看见爹娘在,也不管孩子,这样孩子死掉了,就变成僵尸了。
1、僵尸进程有什么?
在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然保留了一定的信息:进程号、退出状态、运行时间等。
2、保留信息有何用处?
系统默认父进程需要知道子进程的退出状态等信息。
3、僵尸进程危害?
系统所使用的进程号是一个pid_t的类型(typedef int pid_t;),即有符号的整型。在我的机器上:
getconf -a | grep INT
INT_MAX 2147483647
INT_MIN -2147483648
UINT_MAX 4294967295
所以,进程号是有限的,如果有大量的僵尸进程,站着茅坑不拉屎,以后系统启动进程就没有进程号资源了!(当然很难发生,所以不必害怕)
4、如何避免?
很简单,只要保证孩子能有人接管就行。这里分两种,一是由父母负责,二是由政府负责。由父母负责:父进程可以挂起,等待子进程的退出,比如wait,waitpid等函数的调用;父进程也可以使用signal,对信号绑定处理函数。由政府负责:父进程明确告诉init进程,我不关心子进程的退出状态,你接管吧,可以通过忽略SIGCHILD信号达到目的;也可以父进程退出,让子进程成为孤儿,init会自动接手,可以通过两次fork达到目的(祖父不管孙子)。
5、 查看僵尸进程
ps aux 其中的stat字段:(man ps可以查看具体含义)