青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 297,  comments - 15,  trackbacks - 0

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

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

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é)束,那么這個僵尸將一直存在,而且隨著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)程一直是僵尸!
因此,需要對僵尸進(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號程序員

如上面的代碼,在子進(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)程退出的時候,會發(fā)送SIGCHLD信號,默認(rèn)的POSIX不響應(yīng),所以,我們只需要把處理SIGCHLD的函數(shù)自己實(shí)現(xiàn)就OK了,怎么作呢?
signal用于設(shè)置處理信號量的規(guī)則(或跳轉(zhuǎn)到的函數(shù))

1 signal(SIGCHLD,handler);
2 void handler(int num)
3 {
4     //我接受到了SIGCHLD的信號啦
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的信號啦
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 閱讀(402) 評論(0)  編輯 收藏 引用 所屬分類: Linux_Coding
<2025年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關(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

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲一区二区三区免费在线观看| 欧美精品在线免费| 一区二区三区 在线观看视频| 欧美.www| 夜夜嗨一区二区三区| 亚洲欧美三级伦理| 国产一区在线免费观看| 欧美高清视频在线| 久久不见久久见免费视频1| 亚洲国产欧美日韩另类综合| 麻豆91精品| 一本一本a久久| 久久亚洲综合色| 一区二区三区欧美亚洲| 国内精品一区二区| 欧美日韩一区在线视频| 久久国内精品视频| 99国内精品| 鲁大师影院一区二区三区| 亚洲手机在线| 国内精品久久久久久久果冻传媒| 久久综合综合久久综合| 亚洲免费视频在线观看| 免费观看欧美在线视频的网站| 妖精成人www高清在线观看| 国产一区二区av| 国产精品成人一区二区三区夜夜夜| 久久精品国产在热久久| 一区二区高清在线| 欧美成人精品在线观看| 欧美一区二区三区在线观看| 日韩一级片网址| 一区二区三区在线免费观看| 国产精品sm| 欧美大片网址| 久久婷婷国产综合国色天香| 一区二区日韩精品| 亚洲激情午夜| 销魂美女一区二区三区视频在线| 99国产精品私拍| 亚洲国产清纯| 激情成人中文字幕| 狠色狠色综合久久| 国产亚洲欧美一区二区三区| 国产精品免费在线 | 亚洲精品系列| 国内揄拍国内精品少妇国语| 欧美三级资源在线| 老牛国产精品一区的观看方式| 欧美一站二站| 久久精品视频免费| 久久蜜桃香蕉精品一区二区三区| 午夜亚洲性色福利视频| 午夜精品理论片| 久久国产精品99精品国产| 久久av一区二区三区漫画| 久久国产色av| 美女露胸一区二区三区| 毛片基地黄久久久久久天堂 | 美日韩精品视频| 欧美国产一区二区在线观看| 欧美激情视频一区二区三区在线播放| 久久这里只有精品视频首页| 欧美一级专区免费大片| 亚洲欧美激情诱惑| 久久国产精品久久w女人spa| 另类亚洲自拍| 久久综合激情| 欧美激情国产高清| 欧美性一二三区| 国产在线拍揄自揄视频不卡99| 国产日韩精品一区观看| 亚洲高清在线视频| 99成人在线| 欧美在线一二三区| 欧美aⅴ99久久黑人专区| 欧美成人影音| 洋洋av久久久久久久一区| 欧美诱惑福利视频| 欧美久久电影| 国产精品一区二区黑丝| 亚洲第一页在线| 亚洲一区图片| 欧美国产亚洲另类动漫| 国产精品99久久99久久久二8| 欧美一区二区精品在线| 你懂的视频一区二区| 国产精品久久夜| 91久久久在线| 欧美亚洲尤物久久| 亚洲高清一二三区| 香蕉久久夜色精品国产使用方法| 久久嫩草精品久久久精品一| 欧美色图麻豆| 亚洲第一在线综合在线| 亚洲午夜视频在线观看| 欧美1区3d| 香蕉久久国产| 国产精品久久久99| 亚洲精品免费在线播放| 久久久在线视频| 亚洲一区综合| 欧美另类亚洲| 亚洲人成在线观看| 久久久久久久性| 亚洲天堂成人在线观看| 欧美连裤袜在线视频| 伊人久久亚洲热| 久久精品国产v日韩v亚洲| 一本大道久久a久久精二百| 蜜臀av一级做a爰片久久| 国产在线欧美日韩| 欧美在线三区| 亚洲一区二区高清| 亚洲精品色婷婷福利天堂| 久久综合国产精品台湾中文娱乐网| 国产精品久久999| 宅男噜噜噜66一区二区66| 亚洲第一视频| 蜜月aⅴ免费一区二区三区| 国产亚洲欧美一区二区| 午夜精品久久久久久久白皮肤| 亚洲国语精品自产拍在线观看| 久久精彩免费视频| 国产麻豆精品theporn| 亚洲欧美久久久| 99ri日韩精品视频| 欧美美女bbbb| 亚洲一区二区三区三| 亚洲精品国产拍免费91在线| 嫩模写真一区二区三区三州| 亚洲久久在线| 亚洲欧洲一区二区天堂久久| 欧美母乳在线| 亚洲视频香蕉人妖| 亚洲久色影视| 欧美久久影院| 亚洲一区亚洲| 亚洲综合电影| 国产精品不卡在线| 亚洲综合三区| 正在播放欧美一区| 国产精品每日更新| 亚洲自拍偷拍一区| 亚洲精品免费网站| 亚洲精品综合精品自拍| 欧美女激情福利| 亚洲一区二区三区777| 99热在线精品观看| 国产精品久久久久一区二区| 欧美在线free| 久久精品中文字幕免费mv| 国产专区综合网| 久久一区中文字幕| 久久亚裔精品欧美| 91久久夜色精品国产九色| 亚洲国产美女| 欧美日韩精品欧美日韩精品一| 亚洲系列中文字幕| 午夜久久资源| 亚洲国产精品一区二区三区 | 欧美黄色精品| 欧美日韩国产专区| 亚洲午夜精品视频| 午夜日韩在线观看| 亚洲第一毛片| 中文网丁香综合网| 国产资源精品在线观看| 欧美国产三区| 国产精品盗摄一区二区三区| 久久成人免费日本黄色| 女仆av观看一区| 亚洲小说欧美另类社区| 欧美一区二区视频免费观看| 亚洲国产欧美国产综合一区| 亚洲一区日本| 久久婷婷丁香| 欧美一区二区三区另类 | 美女精品在线观看| 亚洲欧美中文日韩在线| 久久国产视频网站| 亚洲一区二区在线视频 | 欧美日韩黄色大片| 久久视频在线视频| 欧美日韩精品综合| 久久久欧美一区二区| 欧美精品九九99久久| 久久人人97超碰精品888| 欧美激情亚洲视频| 久久久久久久久蜜桃| 欧美亚州一区二区三区| 欧美国产丝袜视频| 国产三区二区一区久久| 亚洲伦理自拍| 伊人婷婷久久| 久久成人精品视频| 欧美一区二区免费视频| 欧美三区在线| 久久国产精品久久久| 欧美日韩蜜桃|