僵死状态&&僵尸进程

来源:互联网 发布:王维 李白 知乎 编辑:程序博客网 时间:2024/05/19 02:06

首先表明一下:僵死状态是每个子进程的正常状态,但僵死进程是一种有毒有危害的进程。
孤儿进程:父进程退出,子进程仍在运行,最后会被1号init领养回收
注:ps -el 查看进程状态
(1)僵死状态&僵尸进程:
fork()之后为了让父进程知道子进程的退出, 所以UNⅨ提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息, 就可以得到。这种机制就是: 在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)。直到父进程通过wait / waitpid来取时才释放.

但这样就导致了问题,如果进程不调用wait / waitpid的话,那么保留的那段信息就不会释放,其进程号就会一直被占用,就变成僵尸了
(2)僵尸有毒
(2.1)系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程.
(2.2) 你用root的kill -9 也删不了。
(2.3)内存可能泄露
(3)暴力解决
杀死父进程,把它变成孤儿进程,让init 1号进程来领养。
(4)避免方法
(4.1) 让父进程wait/waitpid,
(4.2) 让父进程使用signal函数,为SIGCLILD的写handler,在handler里wait
(4.3) 如果不关心子进程的结果,父进程使用signal函数对SIGCLILD信号的处理为SIG_IGN忽略。
(4.4)化暴力为技巧:fork两次,父进程fork一个子进程,然后继续工作,子进程fork一 个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。

原创粉丝点击