僵尸进程(Zombie)

今天第一次接触到僵尸进程,网上看了一些资料,写下来,当作自己的学习总结。
首先UNIX僵尸进程的定义在APU2中是这样描述的:In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for it, is called a zombie. ,简单意思是在Unix系统技术中,一个进程结束了,它的父进程还没有等待(调用waitpid/wait函数)他,那么他将变成僵尸进程。为什么会出现这种情况,首先是因为我们在退出进程时调用exit时,并没有真正的被销毁(注:系统调用exit,它的作用是使进程退出,只是将一个正常的进程变成一个僵尸进程,并不能将其完全销毁),而是留一个僵尸进程的数据结构(当中包含子进程结束时的状态信息如进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等),必须等到父进程调用waitpid/wait函数来释放僵尸进程。基本每一个子进程都会变成僵尸进程只是时间长短,但也有例外,假如一个子进程在执行的时候,他的父进程已经结束了,那么这个子进程不会变成僵尸进程,因为这个子进程会被交给init进程进程,init进程会在子进程结束后自动收尸,不会产生子进程。这是因为每一个进程结束的时候,都会扫描系统中的所有进程,看看有没有哪一个进程是刚刚结束的进程的子进程,然后把这个子进程交给init进程接管。
进程的危害:假如僵尸进程一直不处理,就会占用进程号资源,从而因为没有可用的进程号而导致系统不能产生新的进程. 这是僵尸进程的危害。
如何避免僵尸进程:1.可以让父进程调用waitpid/wait函数,但是这会让父进程挂起
2..可以用signal函数为SIGCHLD安装handler,因为子进程结束后, 父进程会收到该信号,可以在handler中调用wait回收。
3.通知内核,自己对子进程不感兴趣,然后子进程结束就会自动被回收
4.两次fork调用,把要用的孙子进程交给init接管,无僵尸进程,但是子进程还是会变成僵尸进程


你可能感兴趣的:(僵尸进程)