当前位置: 技术问答>linux和unix
为什么会产生很多僵死进程?
来源: 互联网 发布时间:2015-01-16
本文导语: 在子进程结束后产生了僵死进程,用了signal(SIGCHLD,SIG_IGN)和signal(SIGCLD,SIG_IGN)都不行,两个能一起用吗? | 只有长期运行而且要产生子进程的程序才需要用wait或waitpid。 僵死进程产生的原因: 子...
在子进程结束后产生了僵死进程,用了signal(SIGCHLD,SIG_IGN)和signal(SIGCLD,SIG_IGN)都不行,两个能一起用吗?
|
只有长期运行而且要产生子进程的程序才需要用wait或waitpid。
僵死进程产生的原因:
子进程退出后(不管是否是正常退出),它在内存中会遗留部分信息成为一个僵死进程,同时内核会向其父进程发送SIGCHLD(或SIGCLD)信号。此时要分几种情况:
1、父进程处理SIGCHLD信号,调用wait,僵死进程消失。这样我们就看不到僵尸进程。
2、父进程忽略SIGCHLD信号,随着子进程不断产生、结束,僵死进程的数目不断增加,导致影响系统速度及其他一些问题。
不需长期运行的程序,即使产生子进程也不会导致大量僵死进程存在。因为,父进程退出时,其产生的子进城成为“孤儿“进程,由init(1号进程)进程接管,init进程在子进程退出时会处理SIGCHLD信号,给子进程“收尸“。
推荐搂主看本书--《Advanced Programming in the UNIX Environment》(Richard Stevents著)。
僵死进程产生的原因:
子进程退出后(不管是否是正常退出),它在内存中会遗留部分信息成为一个僵死进程,同时内核会向其父进程发送SIGCHLD(或SIGCLD)信号。此时要分几种情况:
1、父进程处理SIGCHLD信号,调用wait,僵死进程消失。这样我们就看不到僵尸进程。
2、父进程忽略SIGCHLD信号,随着子进程不断产生、结束,僵死进程的数目不断增加,导致影响系统速度及其他一些问题。
不需长期运行的程序,即使产生子进程也不会导致大量僵死进程存在。因为,父进程退出时,其产生的子进城成为“孤儿“进程,由init(1号进程)进程接管,init进程在子进程退出时会处理SIGCHLD信号,给子进程“收尸“。
推荐搂主看本书--《Advanced Programming in the UNIX Environment》(Richard Stevents著)。
|
解决办法:
在父进程中用wait()或waitpid()来接收终止的子进程。
在父进程中用wait()或waitpid()来接收终止的子进程。
|
to yanyanyan(西门吹盐) ( ) 信誉:100 2002-11-27 10:50:00 得分:0
APUE上是这么说的,不过是指明了版本的.SVR4不会产生僵尸,而4.3+BSD必须wait waitpid 才能避免产生僵尸进程。
两次fork要保证父进程在子进程退出前exit.
APUE上是这么说的,不过是指明了版本的.SVR4不会产生僵尸,而4.3+BSD必须wait waitpid 才能避免产生僵尸进程。
两次fork要保证父进程在子进程退出前exit.