• <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>
            posts - 297,  comments - 15,  trackbacks - 0

            轉(zhuǎn)載請(qǐng)注明:http://www.coder4.com/index.php /archives/151

            首先特別感謝這篇文章給的啟發(fā)!
            http://hi.baidu.com/%D3%EA%BA%E7%D1%F4/blog/item/6490202aaba49193023bf633.html
            對(duì)原作者表示敬意和膜拜!

            fork()之后,非阻塞(異步)等待子進(jìn)程(回收僵尸)。
            fork()之后,子進(jìn)程和父進(jìn)程分叉執(zhí)行,僵尸進(jìn)程的產(chǎn)生是因?yàn)楦高M(jìn)程沒有給子進(jìn)程“收尸”造成的,又可以根據(jù)危害程度分為下述兩類:
            總體來說:當(dāng)子進(jìn)程結(jié)束之后,但父進(jìn)程未結(jié)束之前,子進(jìn)程將成為僵尸進(jìn)程。
            (1)當(dāng)子進(jìn)程結(jié)束之后,但父進(jìn)程未結(jié)束之前,子進(jìn)程將成為僵尸進(jìn)程,父進(jìn)程結(jié)束后僵尸被init進(jìn)程回收。
            (2)如果子進(jìn)程結(jié)束了,但是父進(jìn)程始終沒有結(jié)束,那么這個(gè)僵尸將一直存在,而且隨著exec,僵尸越來越多。
            如下面的代碼,在父進(jìn)程執(zhí)行的5s內(nèi),子進(jìn)程將為僵尸:

            1 /*
            2  * main.cc
            3  *
            4  *  Created on: 2009-12-3
            5  *      Author: liheyuan
            6  *    Describe:
            7  *
            8  *   Last Date: 2009-12-3
            9  *   CopyRight: 2009 @ ICT LiHeyuan
            10  */
            11  
            12 #include <stdio.h>
            13 #include <stdlib.h>
            14 #include <signal.h>
            15 #include <unistd.h>
            16  
            17 int main() {
            18     //子進(jìn)程的pid
            19     int c_pid;
            20     int pid;
            21  
            22     if ((pid = fork())) {
            23         //父進(jìn)程
            24         c_pid = pid;
            25         printf("The child process is %d\n", c_pid);
            26         sleep(5);
            27         exit(0);
            28     } else {
            29         //子進(jìn)程
            30         printf("I 'm a child.\n");
            31         exit(0);
            32     }
            33 }

            如上面的代碼,在父進(jìn)程的5s內(nèi),子進(jìn)程一直是僵尸!
            因此,需要對(duì)僵尸進(jìn)程進(jìn)行回收,傳統(tǒng)的回收方法是,使用wait()函數(shù),等待子進(jìn)程,wait()是阻塞模式的,當(dāng)子進(jìn)程沒有結(jié)束之前,wait一直等 待,不往下面的語句執(zhí)行。

            1 /*
            2  * main.cc
            3  *
            4  *  Created on: 2009-12-3
            5  *      Author: liheyuan
            6  *    Describe:
            7  *
            8  *   Last Date: 2009-12-3
            9  *   CopyRight: 2009 @ ICT LiHeyuan
            10  */
            11  
            12 #include <stdio.h>
            13 #include <stdlib.h>
            14 #include <signal.h>
            15 #include <unistd.h>
            16 #include <sys/wait.h>
            17  
            18 int main() {
            19     //子進(jìn)程的pid
            20     int c_pid;
            21     int pid;
            22  
            23     if ((pid = fork())) {
            24         //父進(jìn)程
            25         c_pid = pid;
            26         printf("The child process is %d\n", c_pid);
            27         //阻塞等待子進(jìn)程
            28         int status;
            29         if ((pid = wait(&status)) != -1 && pid == c_pid) {
            30             //成功回收子進(jìn)程
            31             printf("The child exit with %d\n", WEXITSTATUS(status));
            32             fflush(stdin);
            33         } else {
            34             printf("wait() fail.\n");
            35         }
            36         printf("Now , The child has been exit , and I will sleep.\n");
            37         sleep(20);
            38         exit(0);
            39     } else {
            40         //子進(jìn)程
            41         printf("I 'm a child.\n");
            42         sleep(5);
            43         exit(0);
            44     }
            45 }

            轉(zhuǎn)載自:4號(hào)程序員

            如上面的代碼,在子進(jìn)程執(zhí)行5秒后,即被回收,在夫進(jìn)程的20秒內(nèi),子進(jìn)程已經(jīng)被結(jié)束,不再是僵尸。
            但是這種利用wait()阻塞等待的方法也有一定的缺陷,那就是父進(jìn)程必須等待子進(jìn)程,無法做其他事情,如何非阻塞的等待子進(jìn)程呢?
            man wait,查看NOTES章節(jié),可以找到:
            子進(jìn)程退出的時(shí)候,會(huì)發(fā)送SIGCHLD信號(hào),默認(rèn)的POSIX不響應(yīng),所以,我們只需要把處理SIGCHLD的函數(shù)自己實(shí)現(xiàn)就OK了,怎么作呢?
            signal用于設(shè)置處理信號(hào)量的規(guī)則(或跳轉(zhuǎn)到的函數(shù))

            1 signal(SIGCHLD,handler);
            2 void handler(int num)
            3 {
            4     //我接受到了SIGCHLD的信號(hào)啦
            5     int status;
            6     int pid = waitpid(-1,&status,WNOHANG);
            7     if(WIFEXITED(status))
            8     {
            9         printf("The child exit with code %d",WEXITSTATUS(status));
            10     }
            11 }

             

            OK,全部代碼如下,注意父進(jìn)程不要再用wait阻塞啦!

            1 /*
            2  * main.cc
            3  *
            4  *  Created on: 2009-12-3
            5  *      Author: liheyuan
            6  *    Describe:
            7  *
            8  *   Last Date: 2009-12-3
            9  *   CopyRight: 2009 @ ICT LiHeyuan
            10  */
            11  
            12 #include <stdio.h>
            13 #include <stdlib.h>
            14 #include <signal.h>
            15 #include <unistd.h>
            16 #include <sys/wait.h>
            17  
            18 void handler(int num) {
            19     //我接受到了SIGCHLD的信號(hào)啦
            20     int status;
            21     int pid = waitpid(-1, &status, WNOHANG);
            22     if (WIFEXITED(status)) {
            23         printf("The child %d exit with code %d\n", pid, WEXITSTATUS(status));
            24     }
            25 }
            26  
            27 int main() {
            28     //子進(jìn)程的pid
            29     int c_pid;
            30     int pid;
            31  
            32     signal(SIGCHLD, handler);
            33  
            34     if ((pid = fork())) {
            35         //父進(jìn)程
            36         c_pid = pid;
            37         printf("The child process is %d\n", c_pid);
            38  
            39         //父進(jìn)程不用等待,做自己的事 情吧~
            40         for (int i = 0; i < 10; i++) {
            41             printf("Do parent things.\n");
            42             sleep(1);
            43         }
            44  
            45         exit(0);
            46     } else {
            47         //子進(jìn)程
            48         printf("I 'm a child.\n");
            49         sleep(2);
            50         exit(0);
            51     }
            52 }


            posted on 2010-03-30 11:27 chatler 閱讀(394) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Linux_Coding
            <2011年6月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺這個(gè)博客還是不錯(cuò),雖然做的東西和我不大相關(guān),覺得看看還是有好處的

            network

            OSS

            • Google Android
            • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
            • os161 file list

            overall

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            狼狼综合久久久久综合网| 天天综合久久一二三区| 久久久久一区二区三区| 久久性生大片免费观看性| 精品久久久无码人妻中文字幕| 久久婷婷国产麻豆91天堂| 免费精品国产日韩热久久| 久久精品国产精品青草| 97精品依人久久久大香线蕉97| 91久久精品国产免费直播| 色综合久久久久无码专区| 久久WWW免费人成—看片| 99国产欧美精品久久久蜜芽| 久久精品国产免费观看 | 久久久久久午夜成人影院| 久久精品无码一区二区app| a高清免费毛片久久| 性欧美丰满熟妇XXXX性久久久 | 久久一区二区免费播放| 97久久超碰成人精品网站| 日韩人妻无码精品久久免费一| 久久99精品久久久久久齐齐| 久久精品www| 99久久婷婷国产一区二区| 99久久免费国产精品| 免费观看成人久久网免费观看| 国产日产久久高清欧美一区| 久久久久久亚洲精品成人| 久久精品国产第一区二区三区| 无遮挡粉嫩小泬久久久久久久 | 一级a性色生活片久久无| 久久久精品国产Sm最大网站| 国产精品成人99久久久久 | 久久人与动人物a级毛片| 久久亚洲AV无码精品色午夜| 久久久亚洲裙底偷窥综合 | 久久精品中文字幕久久| 2021国产成人精品久久| 久久99精品久久久久久不卡 | 久久有码中文字幕| 亚洲午夜福利精品久久|