• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            signal(SIGCHLD,SIG_IGN)和signal(SIGCLD,SIG_IGN)

            Posted on 2008-08-21 18:30 Prayer 閱讀(13581) 評論(1)  編輯 收藏 引用 所屬分類: LINUX/UNIX/AIX

             

            在子進(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)程會接管它,成為它的父進(jìn)程,而init進(jìn)程肯定會處理了SIGCHLD信號,所以這樣也不會出現(xiàn)僵死進(jìn)程。  

            在fork前加上信號處理函數(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信號。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的   信號是不排隊(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

            只有長期運(yùn)行而且要產(chǎn)生子進(jìn)程的程序才需要用wait或waitpid。  
              僵死進(jìn)程產(chǎn)生的原因:  
                            子進(jìn)程退出后(不管是否是正常退出),它在內(nèi)存中會遺留部分信息成為一個(gè)僵死進(jìn)程,同時(shí)內(nèi)核會向其父進(jìn)程發(fā)送SIGCHLD(或SIGCLD)信號。此時(shí)要分幾種情況:  
                        1、父進(jìn)程處理SIGCHLD信號,調(diào)用wait,僵死進(jìn)程消失。這樣我們就看不到僵尸進(jìn)程。  
                        2、父進(jìn)程忽略SIGCHLD信號,隨著子進(jìn)程不斷產(chǎn)生、結(jié)束,僵死進(jìn)程的數(shù)目不斷增加,導(dǎo)致影響系統(tǒng)速度及其他一些問題。  
                      不需長期運(yùn)行的程序,即使產(chǎn)生子進(jìn)程也不會導(dǎo)致大量僵死進(jìn)程存在。因?yàn)?,父進(jìn)程退出時(shí),其產(chǎn)生的子進(jìn)城成為“孤兒“進(jìn)程,由init(1號進(jìn)程)進(jìn)程接管,init進(jìn)程在子進(jìn)程退出時(shí)會處理SIGCHLD信號,給子進(jìn)程“收尸“。  
                推薦摟主看本書--《Advanced   Programming   in   the   UNIX   Environment》(Richard   Stevents著)。  
               
              Top

            7 樓wang11912(天天練習(xí))回復(fù)于 2002-11-26 17:25:20 得分 0

            有的長期運(yùn)行的程序只用了  
              signal(SIGCHLD,SIG_IGN);  
              都不會產(chǎn)生僵死進(jìn)程,為什么加了  
              signal(SIGCLD,SIG_IGN);  
              都不管用,都在AIX下運(yùn)行。  
              按照Advanced   Programming   in   the   UNIX   Environment中的說法,如果用了  
              signal(SIGCHLD,SIG_IGN)就可避免僵死進(jìn)程了  
              Top

            8 樓wwwunix(木易)回復(fù)于 2002-11-26 17:46:40 得分 5

            解決辦法:  
              在父進(jìn)程中用wait()或waitpid()來接收終止的子進(jìn)程。Top

            9 樓yanyanyan(西門吹鹽)回復(fù)于 2002-11-27 10:50:16 得分 0

            -----------------------------------------------------------------  
              按照Advanced   Programming   in   the   UNIX   Environment中的說法,如果用了  
              signal(SIGCHLD,SIG_IGN)就可避免僵死進(jìn)程了??????????????  
              -----------------------------------------------------------------  
              誰說的?  
              signal(SIGCHLD,SIG_IGN)是什么意思?--忽略SIGCHLD信號?。。?!  
              在長期運(yùn)行的程序忽略SIGCHLD信號只會產(chǎn)生很多僵死進(jìn)程直到父進(jìn)程結(jié)束。  
               
              只有在父進(jìn)程中捕獲SIGCHLD信號,并在SIGCHLD信號處理函數(shù)中調(diào)用wait才能避免僵死進(jìn)程的出現(xiàn)。  
              當(dāng)然ari(男人阿日)說的辦法也行,就是在你產(chǎn)生子進(jìn)程時(shí)fork兩次,這樣由于第一次fork產(chǎn)生的子進(jìn)程在fork之后就退出,所以第二次fork產(chǎn)生的子進(jìn)程成為“孤兒“進(jìn)程,init進(jìn)程會接管它,成為它的父進(jìn)程,而init進(jìn)程肯定會處理了SIGCHLD信號,所以這樣也不會出現(xiàn)僵死進(jìn)程。  
              摟主的理解有點(diǎn)偏差,好好看看大家的貼子巴?!禔dvanced   Programming   in   the   UNIX   Environment》上也說的很清楚。  
               
               
              Top

            10 樓flyingcrean(flying鶴)回復(fù)于 2002-11-27 13:51:27 得分 0

            在fork前加上信號處理函數(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人的程序,本來不想改動,所以奇怪為什么原來沒有問題,現(xiàn)在卻導(dǎo)致經(jī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上是這么說的,不過是指明了版本的.SVR4不會產(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)程終止后都會發(fā)送SIGCHLD信號給它的父進(jìn)程,并由此變?yōu)榻┧肋M(jìn)程直到父進(jìn)程接收了其狀態(tài)報(bào)告其資源才會被系統(tǒng)釋放;  
              處理方法有3種:  
              1. 當(dāng)子進(jìn)程終止時(shí)父進(jìn)程接收SIGCHLD信號并調(diào)用waitpid()函數(shù)接收其狀態(tài)報(bào)告,最好用sigaction(),signal()不可靠;  
              2. 通過函數(shù)sigaction指明標(biāo)志SA_NOCLDWAIT來指定信號SIGCHLD的動作,這使得內(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)   提醒,抱歉,我可能講的不是很清楚

            Feedback

            # re: signal(SIGCHLD,SIG_IGN)和signal(SIGCLD,SIG_IGN)  回復(fù)  更多評論   

            2013-12-07 01:09 by 客串一回
            謝謝,今天用fork寫httpd的時(shí)候,發(fā)現(xiàn)進(jìn)程僵死了,不知該怎么辦。
            多謝提示,該去看看signal相關(guān)的東西
            久久久久久人妻无码| 久久久久久国产a免费观看黄色大片| 99久久免费国产精品特黄| 偷窥少妇久久久久久久久| 国产精品久久婷婷六月丁香| 亚洲成色WWW久久网站| 国产精品久久久久jk制服| 精品久久久久久无码国产| 狠狠综合久久AV一区二区三区| 久久精品国产亚洲AV大全| 久久精品国产精品亚洲人人| 久久人人爽人人爽人人爽 | 色播久久人人爽人人爽人人片AV| 亚洲中文久久精品无码| 国产精品99久久久久久董美香| 伊人精品久久久久7777| 免费国产99久久久香蕉| 新狼窝色AV性久久久久久| 久久精品国产一区二区电影| 久久精品午夜一区二区福利| 久久久久久极精品久久久| 久久综合久久综合九色| 久久久噜噜噜久久中文字幕色伊伊 | 精品一区二区久久| 亚洲中文字幕无码一久久区| 99热成人精品免费久久| 99麻豆久久久国产精品免费| 伊人久久综合精品无码AV专区| 久久精品成人免费观看97| 亚洲综合精品香蕉久久网97 | 2021国内精品久久久久久影院| 免费国产99久久久香蕉| 狠狠色噜噜狠狠狠狠狠色综合久久| 亚洲国产精品成人久久蜜臀 | 久久精品无码专区免费东京热| 国产成人综合久久精品红| 香蕉久久AⅤ一区二区三区| 欧美色综合久久久久久| 亚洲国产成人久久笫一页| 久久久久99这里有精品10| 伊人久久成人成综合网222|