• <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)系 :: 聚合  :: 管理

            僵死進程及避免方法

            Posted on 2009-04-14 15:28 Prayer 閱讀(979) 評論(0)  編輯 收藏 引用 所屬分類: LINUX/UNIX/AIX

            1. 僵死進程

            當(dāng)一個程序創(chuàng)建的子進程比父進程提前結(jié)束,內(nèi)核仍然保存一些它的信息以便父進程會需要它 - 比如,父進程可能需要檢查子進程的退出狀態(tài)。為了得到這些

            信息,父進程調(diào)用‘wait()’;當(dāng)這個調(diào)用發(fā)生,內(nèi)核可以丟棄這些信息。

            在子進程終止后到父進程調(diào)用‘wait()’前的時間里,子進程被稱為‘僵死進程’ (‘zombie’)。(如果你用‘ps’,這個子進程會有一個‘Z’出現(xiàn)在它的

            狀態(tài)區(qū)里指出這點。)

            也就是說,當(dāng)子進程調(diào)用 do_exit() 后,子進程就終止了,與次進程相關(guān)聯(lián)的所有資源都被釋放掉了(假設(shè)進程是這些資源的唯一使用者)。 進程不可

            運行,并處于TASK_ZOMBIE狀態(tài)。它所占用的資源就是內(nèi)核棧,thread_info結(jié)構(gòu)和task_struct結(jié)構(gòu)。此時進程存在的唯一目的就是向它的

            父進程提供信息(子進程的退出代碼,也就是exit()提供的,存儲在task_struct中的exit_code成員)。父進程檢索到信息后(通過wait()系統(tǒng)調(diào)用),


            或者通知內(nèi)核那是無關(guān)的信息后(在某些系統(tǒng)上,你可以指令系統(tǒng)你對子進程的退出狀態(tài)沒有興趣,在SysV系統(tǒng)上,可以調(diào)用signal函數(shù),

            設(shè)置SIGCLD信號為 SIG_IGN,系統(tǒng)將不產(chǎn)生僵死進程, 詳細說明參見<<高級編程>>10.7節(jié)),  由進程所持有的剩余內(nèi)存被釋放,歸還給系統(tǒng)使用。

            2. 怎樣避免僵死進程的出現(xiàn)
            需要卻認父進程為每個子進程的終止調(diào)用‘wait()’(或者‘waitpid()’, ‘wait3()’,等等); 或者,在某些系統(tǒng)上,你可以指令系統(tǒng)你對子進程的退出狀態(tài)沒有興趣。(譯者注:在SysV系統(tǒng)上,可以調(diào)用signal函數(shù),設(shè)置SIGCLD信號為 SIG_IGN,系統(tǒng)將不產(chǎn)生僵死進程, 詳細說明參見<<高級編程>>10.7節(jié))。


            另一種方法是兩次‘fork()’,而且使緊跟的子進程直接退出,這樣造成孫子進程變成孤兒進程(orphaned),從而init進程將負責(zé)清除它。欲獲得做這個的程序,參看范例章節(jié)的函數(shù)‘fork2()’。

            為了忽略子進程狀態(tài),你需要做下面的步驟(查詢你的系統(tǒng)手冊頁以知道這是否正常工作):

            struct sigaction sa;
            sa.sa_handler = SIG_IGN;
            #ifdef SA_NOCLDWAIT
            sa.sa_flags = SA_NOCLDWAIT;
            #else
            sa.sa_flags = 0;
            #endif
            sigemptyset(&sa.sa_mask);
            sigaction(SIGCHLD, &sa, NULL);

            如果這是成功的,那么‘wait()’函數(shù)集將不再正常工作;如果它們中任何一個被調(diào)用,它們將等待直到*所有*子進程已經(jīng)退出,然后返回失敗,并且 ‘errno==ECHILD’。

            另一個技巧是捕獲SIGCHLD信號,然后使信號處理程序調(diào)用‘waitpid()’或 ‘wait3()’。參見范例章節(jié)的完整程序。

            參考文獻:

            http://www.juntuan.net/hkbc/nixbc/unix/x178.htm

            《APUE》

            《LKD》

             

             

            文章出處:http://www.diybl.com/course/6_system/linux/Linuxjs/200888/135107.html

            久久久久国产成人精品亚洲午夜| 久久久精品人妻一区二区三区四 | 99久久国产综合精品成人影院| 久久精品中文无码资源站| 国产成人99久久亚洲综合精品| 97久久精品国产精品青草| 99久久超碰中文字幕伊人| 日韩人妻无码精品久久免费一 | 日韩久久无码免费毛片软件| 国产高潮久久免费观看| 久久精品亚洲精品国产欧美| 久久99国产一区二区三区| 久久久久国产成人精品亚洲午夜| 欧美久久亚洲精品| 欧美黑人激情性久久| 精品多毛少妇人妻AV免费久久| 精品国产乱码久久久久久人妻| 亚洲狠狠婷婷综合久久久久| 国产麻豆精品久久一二三| 久久亚洲国产精品一区二区| 久久亚洲精品视频| 久久综合久久鬼色| 无码人妻精品一区二区三区久久久| 亚洲AV无码1区2区久久 | 国产精品午夜久久| 无码精品久久一区二区三区| 日韩人妻无码一区二区三区久久| 久久99国产精品久久久| 欧美精品福利视频一区二区三区久久久精品 | 久久精品18| 久久久噜噜噜久久中文字幕色伊伊| 久久99久国产麻精品66| 99久久综合狠狠综合久久止| 久久国产精品偷99| 久久香综合精品久久伊人| 国产午夜福利精品久久| 亚洲国产精品无码久久98| 99久久99久久精品国产片果冻| 偷偷做久久久久网站| a级毛片无码兔费真人久久| 亚洲香蕉网久久综合影视|