僵尸进程的危害及避免

博客介绍了僵尸进程相关知识。因子进程结束和父进程运行异步,父进程可能丢失子进程结束状态信息,导致僵尸进程。僵尸进程会占用进程号,大量存在时会使系统无法产生新进程。还给出避免危害的方法,如父进程等待、安装信号处理函数等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么会存在僵尸进程

由于子进程的结束和父进程的运行是一个异步的过程,所以父进程不知道子进程什么时候结束,这可能导致当子进程结束时父进程太忙而丢失子进程结束时的状态信息。于是,UNIX提供了一种机制保证了只要父进程想要看到子进程结束的信息,就能看到。这种机制就是:在每个进程退出时,内核释放所有资源,但扔然保留一定的信息,如进程号,退出信息,运行时间等等,这些信息要知道父进程来取,并且由父进程释放,但我们知道进程对SIGCHLD信号的默认处理方式为忽略,这样子进程的保留的那部分信息可能就一直得不到释放,导致僵尸进程。

僵尸进程的危害

一个僵尸进程并不怕,可怕的是一群僵尸进程,我们知道僵尸进程会保留进程号,而我们的系统能够使用的进程号是有限的,即如果大量的僵尸进程存在,就可能因为没有可用的进程号而导致系统不能产生新的进程。

如何避免僵尸进程的危害

⒈父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。
⒉ 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后, 父进程会收到该信号,可以在handler中调用wait回收。
⒊ 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD,SIG_IGN) 通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收, 并不再给父进程发送信号。
⒋ 连续fork两次,父进程fork一个子进程,然后继续工作,子进程fork一 个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收 还要自己做。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值