• <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)論排行榜

            久久精品国产一区二区电影| 粉嫩小泬无遮挡久久久久久| 狠狠色丁香婷综合久久| 久久精品国产亚洲av麻豆图片| 国产福利电影一区二区三区,免费久久久久久久精 | 午夜天堂精品久久久久| 久久久久久久波多野结衣高潮| 亚洲一区精品伊人久久伊人| 久久亚洲色一区二区三区| 久久久久久一区国产精品| 久久久人妻精品无码一区| 欧美一区二区久久精品| 伊人久久大香线蕉成人| 久久丝袜精品中文字幕| 武侠古典久久婷婷狼人伊人| 久久亚洲精品成人无码网站| 狠狠色婷婷久久综合频道日韩 | 精品国产乱码久久久久软件| 亚洲国产欧美国产综合久久| 韩国免费A级毛片久久| 91视频国产91久久久| 精品久久久久久无码中文野结衣| 久久综合视频网站| 亚洲AV无码1区2区久久| 国内精品久久久久久麻豆| 久久伊人精品一区二区三区| 国产一区二区三区久久精品| 麻豆国内精品久久久久久| 久久91精品国产91久| 久久国产精品一区二区| 综合久久精品色| 精品久久久久久亚洲| 免费精品久久久久久中文字幕| 久久精品人人做人人爽电影蜜月 | 伊人久久精品无码av一区| 亚洲国产成人久久综合碰碰动漫3d| 青青热久久国产久精品| 97久久综合精品久久久综合| 日本WV一本一道久久香蕉| 久久精品国产99国产精品澳门| 欧美亚洲国产精品久久久久|