• <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亚洲人成电影网站| 国产精品欧美亚洲韩国日本久久 | 久久伊人五月丁香狠狠色| 久久精品亚洲欧美日韩久久| 精品国产乱码久久久久久呢| 久久香综合精品久久伊人| 国产精品无码久久四虎| 久久精品国产清自在天天线| 中文字幕一区二区三区久久网站| 人妻无码久久精品| 99久久精品国产免看国产一区| 欧美粉嫩小泬久久久久久久| 久久久久女人精品毛片| 欧美粉嫩小泬久久久久久久| 激情伊人五月天久久综合| 日日狠狠久久偷偷色综合0| 99久久这里只有精品| 久久久午夜精品| 久久夜色撩人精品国产小说| 久久久无码精品亚洲日韩按摩| 午夜精品久久久内射近拍高清| 久久不射电影网| 久久人人爽人人爽人人AV| 欧美成人免费观看久久| 狠狠人妻久久久久久综合蜜桃| 精品久久久无码人妻中文字幕豆芽| 一本久久综合亚洲鲁鲁五月天| 国产女人aaa级久久久级| 99久久国产热无码精品免费 | 久久婷婷色香五月综合激情| 大蕉久久伊人中文字幕| 久久99国产精品一区二区| 国产情侣久久久久aⅴ免费| 久久精品国产亚洲AV不卡| 久久精品国产久精国产一老狼| 中文精品99久久国产 | 办公室久久精品| av国内精品久久久久影院| 无码伊人66久久大杳蕉网站谷歌 | 久久免费视频1|