在子進(jìn)程結(jié)束后產(chǎn)生了僵死進(jìn)程,用了signal(SIGCHLD,SIG_IGN)和signal(SIGCLD,SIG_IGN)都不行,兩個(gè)能一起用嗎?
你產(chǎn)生子進(jìn)程時(shí)fork兩次,這樣由于第一次fork產(chǎn)生的子進(jìn)程在fork之后就退出,所以第二次fork產(chǎn)生的子進(jìn)程成為“孤兒“進(jìn)程,init進(jìn)程會(huì)接管它,成為它的父進(jìn)程,而init進(jìn)程肯定會(huì)處理了SIGCHLD信號(hào),所以這樣也不會(huì)出現(xiàn)僵死進(jìn)程。
在fork前加上信號(hào)處理函數(shù):
signal(SIG_CHLD, Proc_CHLD);
void Proc_CHLD(int SIGNO)
{
int pid = -1;
int stat;
while(pid=waitpid(0, &stat, WHNONG);
}
1 樓95533(鼠標(biāo)墊)
回復(fù)于 2002-11-11 09:40:38 得分 0
可以一起用,這兩句的意思是屏蔽SIGCHLD和SIGCLD信號(hào)。Top
2 樓ari(薛定鍔)回復(fù)于 2002-11-11 10:15:36 得分 0
fork 兩次即可解決Top
3 樓gongdath(gongdath)回復(fù)于 2002-11-11 12:39:28 得分 0
應(yīng)該在父進(jìn)程中調(diào)用wait或waitpid涵數(shù).Top
4 樓1010101010(Number)回復(fù)于 2002-11-12 09:31:37 得分 0
最好是用waitpid,因可能有多個(gè)子進(jìn)程,而unix的 信號(hào)是不排隊(duì)的Top
5 樓wang11912(天天練習(xí))回復(fù)于 2002-11-26 12:01:20 得分 0
可是有的程序也沒有用wait,waitpid卻沒有產(chǎn)生僵死進(jìn)程,真的不知道為什么?
Top
6 樓yanyanyan(西門吹鹽)回復(fù)于 2002-11-26 14:30:13 得分 10
只有長(zhǎng)期運(yùn)行而且要產(chǎn)生子進(jìn)程的程序才需要用wait或waitpid。
僵死進(jìn)程產(chǎn)生的原因:
子進(jìn)程退出后(不管是否是正常退出),它在內(nèi)存中會(huì)遺留部分信息成為一個(gè)僵死進(jìn)程,同時(shí)內(nèi)核會(huì)向其父進(jìn)程發(fā)送SIGCHLD(或SIGCLD)信號(hào)。此時(shí)要分幾種情況:
1、父進(jìn)程處理SIGCHLD信號(hào),調(diào)用wait,僵死進(jìn)程消失。這樣我們就看不到僵尸進(jìn)程。
2、父進(jìn)程忽略SIGCHLD信號(hào),隨著子進(jìn)程不斷產(chǎn)生、結(jié)束,僵死進(jìn)程的數(shù)目不斷增加,導(dǎo)致影響系統(tǒng)速度及其他一些問(wèn)題。
不需長(zhǎng)期運(yùn)行的程序,即使產(chǎn)生子進(jìn)程也不會(huì)導(dǎo)致大量僵死進(jìn)程存在。因?yàn)椋高M(jìn)程退出時(shí),其產(chǎn)生的子進(jìn)城成為“孤兒“進(jìn)程,由init(1號(hào)進(jìn)程)進(jìn)程接管,init進(jìn)程在子進(jìn)程退出時(shí)會(huì)處理SIGCHLD信號(hào),給子進(jìn)程“收尸“。
推薦摟主看本書--《Advanced Programming in the UNIX Environment》(Richard Stevents著)。
Top
7 樓wang11912(天天練習(xí))回復(fù)于 2002-11-26 17:25:20 得分 0
有的長(zhǎng)期運(yùn)行的程序只用了
signal(SIGCHLD,SIG_IGN);
都不會(huì)產(chǎn)生僵死進(jìn)程,為什么加了
signal(SIGCLD,SIG_IGN);
都不管用,都在AIX下運(yùn)行。
按照Advanced Programming in the UNIX Environment中的說(shuō)法,如果用了
signal(SIGCHLD,SIG_IGN)就可避免僵死進(jìn)程了
Top
8 樓wwwunix(木易)回復(fù)于 2002-11-26 17:46:40 得分 5
解決辦法:
在父進(jìn)程中用wait()或waitpid()來(lái)接收終止的子進(jìn)程。Top
9 樓yanyanyan(西門吹鹽)回復(fù)于 2002-11-27 10:50:16 得分 0
-----------------------------------------------------------------
按照Advanced Programming in the UNIX Environment中的說(shuō)法,如果用了
signal(SIGCHLD,SIG_IGN)就可避免僵死進(jìn)程了??????????????
-----------------------------------------------------------------
誰(shuí)說(shuō)的?
signal(SIGCHLD,SIG_IGN)是什么意思?--忽略SIGCHLD信號(hào)?。。。?
在長(zhǎng)期運(yùn)行的程序忽略SIGCHLD信號(hào)只會(huì)產(chǎn)生很多僵死進(jìn)程直到父進(jìn)程結(jié)束。
只有在父進(jìn)程中捕獲SIGCHLD信號(hào),并在SIGCHLD信號(hào)處理函數(shù)中調(diào)用wait才能避免僵死進(jìn)程的出現(xiàn)。
當(dāng)然ari(男人阿日)說(shuō)的辦法也行,就是在你產(chǎn)生子進(jìn)程時(shí)fork兩次,這樣由于第一次fork產(chǎn)生的子進(jìn)程在fork之后就退出,所以第二次fork產(chǎn)生的子進(jìn)程成為“孤兒“進(jìn)程,init進(jìn)程會(huì)接管它,成為它的父進(jìn)程,而init進(jìn)程肯定會(huì)處理了SIGCHLD信號(hào),所以這樣也不會(huì)出現(xiàn)僵死進(jìn)程。
摟主的理解有點(diǎn)偏差,好好看看大家的貼子巴。《Advanced Programming in the UNIX Environment》上也說(shuō)的很清楚。
Top
10 樓flyingcrean(flying鶴)回復(fù)于 2002-11-27 13:51:27 得分 0
在fork前加上信號(hào)處理函數(shù):
signal(SIG_CHLD, Proc_CHLD);
void Proc_CHLD(int SIGNO)
{
int pid = -1;
int stat;
while(pid=waitpid(0, &stat, WHNONG);
}
Top
11 樓wang11912(天天練習(xí))回復(fù)于 2002-11-27 15:20:10 得分 0
我已經(jīng)改為用wait的方式了,解決了。
因?yàn)槭莿e人的程序,本來(lái)不想改動(dòng),所以奇怪為什么原來(lái)沒有問(wèn)題,現(xiàn)在卻導(dǎo)致經(jīng)常要重新啟動(dòng),可能是操作系統(tǒng)哪個(gè)補(bǔ)丁沒打上。
謝謝大家。Top
12 樓bnwxf(有一種感覺叫從容)回復(fù)于 2002-11-28 20:46:29 得分 0
unix 網(wǎng)絡(luò)編程。
里面將了一個(gè)用循環(huán)寫的SIG_CLD的處理函數(shù)。
如果子進(jìn)程很多,推薦用這一標(biāo)準(zhǔn)做法。Top
13 樓whoke(hy)回復(fù)于 2002-12-07 14:50:17 得分 5
to yanyanyan(西門吹鹽) ( ) 信譽(yù):100 2002-11-27 10:50:00 得分:0
APUE上是這么說(shuō)的,不過(guò)是指明了版本的.SVR4不會(huì)產(chǎn)生僵尸,而4.3+BSD必須wait waitpid 才能避免產(chǎn)生僵尸進(jìn)程。
兩次fork要保證父進(jìn)程在子進(jìn)程退出前exit.Top
14 樓cwhh(hh)回復(fù)于 2002-12-28 17:56:59 得分 0
一般當(dāng)一個(gè)進(jìn)程終止后都會(huì)發(fā)送SIGCHLD信號(hào)給它的父進(jìn)程,并由此變?yōu)榻┧肋M(jìn)程直到父進(jìn)程接收了其狀態(tài)報(bào)告其資源才會(huì)被系統(tǒng)釋放;
處理方法有3種:
1. 當(dāng)子進(jìn)程終止時(shí)父進(jìn)程接收SIGCHLD信號(hào)并調(diào)用waitpid()函數(shù)接收其狀態(tài)報(bào)告,最好用sigaction(),signal()不可靠;
2. 通過(guò)函數(shù)sigaction指明標(biāo)志SA_NOCLDWAIT來(lái)指定信號(hào)SIGCHLD的動(dòng)作,這使得內(nèi)核在調(diào)用者的子進(jìn)程終止時(shí)不創(chuàng)建僵死進(jìn)程。
3. 二次fork調(diào)用;
Top
15 樓yanyanyan(西門吹鹽)回復(fù)于 2002-12-30 10:57:06 得分 0
謝謝 whoke(hy) 提醒,抱歉,我可能講的不是很清楚