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

為生存而奔跑

   :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
  271 Posts :: 0 Stories :: 58 Comments :: 0 Trackbacks

留言簿(5)

我參與的團(tuán)隊(duì)

搜索

  •  

積分與排名

  • 積分 - 331733
  • 排名 - 74

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

  1. #include <stdio.h>  
  2. #include <sys/wait.h>  
  3. #include <sys/types.h>  
  4. #include <unistd.h>  
  5.   
  6. int main(void)     
  7. {     
  8.    pid_t pid;     
  9.     
  10.     if ((pid = fork()) < 0)     
  11.     {     
  12.         fprintf(stderr,"Fork error!\n");     
  13.         exit(-1);     
  14.     }     
  15.     else if (pid == 0) /* first child */    
  16.     {      
  17.         if ((pid = fork()) < 0)     
  18.         {      
  19.             fprintf(stderr,"Fork error!\n");     
  20.             exit(-1);     
  21.         }     
  22.         else if (pid > 0)     
  23.             exit(0); /* parent from second fork == first child */    
  24.         /*   
  25.          * We're the second child; our parent becomes init as soon   
  26.          * as our real parent calls exit() in the statement above.   
  27.          * Here's where we'd continue executing, knowing that when   
  28.          * we're done, init will reap our status.   
  29.          */    
  30.         sleep(2);     
  31.         printf("Second child, parent pid = %d\n", getppid());     
  32.         exit(0);     
  33.     }     
  34.          
  35.     if (waitpid(pid, NULL, 0) != pid) /* wait for first child */    
  36.     {     
  37.         fprintf(stderr,"Waitpid error!\n");     
  38.         exit(-1);     
  39.     }     
  40.     
  41.     /*   
  42.      * We're the parent (the original process); we continue executing,   
  43.      * knowing that we're not the parent of the second child.   
  44.      */    
  45.     exit(0);     
  46. }     

fork兩次在防止僵死方面來(lái)說(shuō),就是因?yàn)閮鹤舆M(jìn)程先退出,孫子進(jìn)程就被init接管了,實(shí)際上與最初的父進(jìn)程脫離了關(guān)系,就不會(huì)僵死了。見(jiàn)APUE 的P151以下描述:

回憶一下8 . 5節(jié)中有關(guān)僵死進(jìn)程的討論。如果一個(gè)進(jìn)程要f o r k一個(gè)子進(jìn)程,但不要求它等待
子進(jìn)程終止,也不希望子進(jìn)程處于僵死狀態(tài)直到父進(jìn)程終止,實(shí)現(xiàn)這一要求的訣竅是調(diào)用f o r k
兩次。程序8 - 5實(shí)現(xiàn)了這一點(diǎn)。
在第二個(gè)子進(jìn)程中調(diào)用s l e e p以保證在打印父進(jìn)程I D時(shí)第一個(gè)子進(jìn)程已終止。在f o r k之后,
父、子進(jìn)程都可繼續(xù)執(zhí)行——我們無(wú)法預(yù)知哪一個(gè)會(huì)先執(zhí)行。如果不使第二個(gè)子進(jìn)程睡眠,則
在f o r k之后,它可能比其父進(jìn)程先執(zhí)行,于是它打印的父進(jìn)程I D將是創(chuàng)建它的父進(jìn)程,而不是
i n i t進(jìn)程(進(jìn)程ID 1)。

兩次fork的其它作用就是做daemon:

 

  1. void InitAsDaemon()     
  2. {     
  3.  if (Fork() > 0)     
  4.   exit(0);     
  5.     
  6.  setsid();     
  7.     
  8.  Signal(SIGINT, SIG_IGN);     
  9.  Signal(SIGHUP, SIG_IGN);     
  10.  Signal(SIGQUIT, SIG_IGN);     
  11.  Signal(SIGPIPE, SIG_IGN);     
  12.  Signal(SIGTTOU, SIG_IGN);     
  13.  Signal(SIGTTIN, SIG_IGN);     
  14.  Signal(SIGCHLD, SIG_IGN);     
  15.     
  16.  if (Fork() > 0)     
  17.   exit(0);     
  18.     
  19.  chdir("/");     
  20.  umask(0);     
  21. }  

關(guān)于僵尸進(jìn)程:

  在fork()/execve()過(guò)程中,假設(shè)子進(jìn)程結(jié)束時(shí)父進(jìn)程仍存在,而父進(jìn)程fork()之前既沒(méi)安裝SIGCHLD信號(hào)處理函數(shù)調(diào)用waitpid()等待子進(jìn)程結(jié)束,又沒(méi)有顯式忽略該信號(hào),則子進(jìn)程成為僵尸進(jìn)程,無(wú)法正常結(jié)束,此時(shí)即使是root身份kill -9也不能殺死僵尸進(jìn)程。補(bǔ)救辦法是殺死僵尸進(jìn)程的父進(jìn)程(僵尸進(jìn)程的父進(jìn)程必然存在),僵尸進(jìn)程成為"孤兒進(jìn)程",過(guò)繼給1號(hào)進(jìn)程init,init始終會(huì)負(fù)責(zé)清理僵尸進(jìn)程。

  僵尸進(jìn)程是指的父進(jìn)程已經(jīng)退出,而該進(jìn)程dead之后沒(méi)有進(jìn)程接受,就成為僵尸進(jìn)程.(zombie)進(jìn)程 
  怎樣產(chǎn)生僵尸進(jìn)程的: 
  一個(gè)進(jìn)程在調(diào)用exit命令結(jié)束自己的生命的時(shí)候,其實(shí)它并沒(méi)有真正的被銷毀,而是留下一個(gè)稱為僵尸進(jìn)程(Zombie)的數(shù)據(jù)結(jié)構(gòu)(系統(tǒng)調(diào)用exit,它的作用是使進(jìn)程退出,但也僅僅限于將一個(gè)正常的進(jìn)程變成一個(gè)僵尸進(jìn)程,并不能將其完全銷毀)。在Linux進(jìn)程的狀態(tài)中,僵尸進(jìn)程 
  是非常特殊的一種,它已經(jīng)放棄了幾乎所有內(nèi)存空間,沒(méi)有任何可執(zhí)行代碼,也不能被調(diào)度,僅僅在進(jìn)程列表中保留一個(gè)位置,記載該進(jìn)程的退 
  出狀態(tài)等信息供其他進(jìn)程收集,除此之外,僵尸進(jìn)程不再占有任何內(nèi)存空間。它需要它的父進(jìn)程來(lái)為它收尸,如果他的父進(jìn)程沒(méi)安裝SIGCHLD信 
  號(hào)處理函數(shù)調(diào)用wait或waitpid()等待子進(jìn)程結(jié)束,又沒(méi)有顯式忽略該信號(hào),那么它就一直保持僵尸狀態(tài),如果這時(shí)父進(jìn)程結(jié)束了,那么init進(jìn)程自動(dòng) 
  會(huì)接手這個(gè)子進(jìn)程,為它收尸,它還是能被清除的。但是如果如果父進(jìn)程是一個(gè)循環(huán),不會(huì)結(jié)束,那么子進(jìn)程就會(huì)一直保持僵尸狀態(tài),這就是為什么系統(tǒng)中有時(shí)會(huì)有很多的僵尸進(jìn)程。 
  怎么查看僵尸進(jìn)程: 
  利用命令ps,可以看到有標(biāo)記為Z的進(jìn)程就是僵尸進(jìn)程。 
  怎樣來(lái)清除僵尸進(jìn)程: 
  1.改寫父進(jìn)程,在子進(jìn)程死后要為它收尸。具體做法是接管SIGCHLD信號(hào)。子進(jìn)程死后,會(huì)發(fā)送SIGCHLD信號(hào)給父進(jìn)程,父進(jìn)程收到此信號(hào)后,執(zhí)行waitpid()函數(shù)為子進(jìn)程收尸。這是基于這樣的原理:就算父進(jìn)程沒(méi)有調(diào)用wait,內(nèi)核也會(huì)向它發(fā)送SIGCHLD消息,盡管對(duì)的默認(rèn)處理是忽略,如果想響應(yīng)這個(gè)消息,可以設(shè)置一個(gè)處理函數(shù)。 
  2.把父進(jìn)程殺掉。父進(jìn)程死后,僵尸進(jìn)程成為"孤兒進(jìn)程",過(guò)繼給1號(hào)進(jìn)程init,init始終會(huì)負(fù)責(zé)清理僵尸進(jìn)程.它產(chǎn)生的所有僵尸進(jìn)程也跟著消失。
  =========================================== 
  在Linux中可以用 
  ps auwx 
  發(fā)現(xiàn)僵尸進(jìn)程 
  a all w/ tty, including other users 所有窗口和終端,包括其他用戶的進(jìn)程 
  u user-oriented 面向用戶(用戶友好) 
  -w,w wide output 寬格式輸出 
  x processes w/o controlling ttys 
  在僵尸進(jìn)程后面 會(huì)標(biāo)注 
  ps axf 
  看進(jìn)程樹(shù),以樹(shù)形方式現(xiàn)實(shí)進(jìn)程列表 
  ps axm 
  會(huì)把線程列出來(lái),在linux下進(jìn)程和線程是統(tǒng)一的,是輕量級(jí)進(jìn)程的兩種方式。 
  ps axu 
  顯示進(jìn)程的詳細(xì)狀態(tài) 
  =========================================== 
  killall 
  kill -15 
  kill -9 
  一般都不能殺掉 defunct進(jìn)程 
  用了kill -15,kill -9以后 之后反而會(huì)多出更多的僵尸進(jìn)程 
  kill -kill pid 
  fuser -k pid 
  可以考慮殺死他的parent process, 
  kill -9 他的parent process 
  =========================================== 
  一個(gè)已經(jīng)終止,但是其父進(jìn)程尚未對(duì)其進(jìn)行善后處理(獲取終止子進(jìn)程的有關(guān)信息、釋放它仍占用的資源)的進(jìn)程被稱為僵死進(jìn)程(Zombie Process)。 
  避免zombie的方法: 
  1)在SVR4中,如果調(diào)用signal或sigset將SIGCHLD的配置設(shè)置為忽略,則不會(huì)產(chǎn)生僵死子進(jìn)程。另外,使用SVR4版的sigaction,則可設(shè)置SA_NOCLDWAIT標(biāo)志以避免子進(jìn)程僵死。 
  Linux中也可使用這個(gè),在一個(gè)程序的開(kāi)始調(diào)用這個(gè)函數(shù) 
  signal(SIGCHLD,SIG_IGN); 
  2)調(diào)用fork兩次。程序8 - 5 實(shí)現(xiàn)了這一點(diǎn)。 
  3)用waitpid等待子進(jìn)程返回. 
  =========================================== 
  zombie進(jìn)程是僵死進(jìn)程。防止它的辦法,一是用wait,waitpid之類的函數(shù)獲得 
  進(jìn)程的終止?fàn)顟B(tài),以釋放資源。另一個(gè)是fork兩次 
  =========================================== 
  defunct進(jìn)程只是在process table里還有一個(gè)記錄,其他的資源沒(méi)有占用,除非你的系統(tǒng)的process個(gè)數(shù)的限制已經(jīng)快超過(guò)了,zombie進(jìn)程不會(huì)有更多的壞處。 
  可能唯一的方法就是reboot系統(tǒng)可以消除zombie進(jìn)程。 
  =========================================== 
  任何程序都有僵尸狀態(tài),它占用一點(diǎn)內(nèi)存資源(也就是進(jìn)程表里還有一個(gè)記錄),僅僅是表象而已不必害怕。如果程序有問(wèn)題有機(jī)會(huì)遇見(jiàn),解決大批量僵尸簡(jiǎn)單有效的辦法是重起。kill是無(wú)任何效果的 
  fork與zombie/defunct" 
  在Unix下的一些進(jìn)程的運(yùn)作方式。當(dāng)一個(gè)進(jìn)程死亡時(shí),它并不是完全的消失了。進(jìn)程終止,它不再運(yùn)行,但是還有一些殘留的小東西等待父進(jìn)程收回。這些殘留的東西包括子進(jìn)程的返回值和其他的一些東西。當(dāng)父進(jìn)程 fork() 一個(gè)子進(jìn)程后,它必須用 wait() 或者 waitpid() 等待子進(jìn)程退出。正是這個(gè) wait() 動(dòng)作來(lái)讓子進(jìn)程的殘留物消失。 
  自然的,在上述規(guī)則之外有個(gè)例外:父進(jìn)程可以忽略 SIGCLD 軟中斷而不必要 wait()??梢赃@樣做到(在支持它的系統(tǒng)上,比如Linux): 
  1. main()      
  2.     
  3.   {      
  4.     
  5.   signal(SIGCLD, SIG_IGN); /* now I don't have to wait()! */      
  6.     
  7.   .      
  8.     
  9.   .      
  10.     
  11.   fork();      
  12.     
  13.   fork();      
  14.     
  15.   fork(); /* Rabbits, rabbits, rabbits! */      
  16.     
  17.  }    
    現(xiàn)在,子進(jìn)程死亡時(shí)父進(jìn)程沒(méi)有 wait(),通常用 ps 可以看到它被顯示為“”。它將永遠(yuǎn)保持這樣 直到 父進(jìn)程 wait(),或者按以下方法處理。 
  這里是你必須知道的另一個(gè)規(guī)則:當(dāng)父進(jìn)程在它wait()子進(jìn)程之前死亡了(假定它沒(méi)有忽略 SIGCLD),子進(jìn)程將把 init(pid 1)進(jìn)程作為它的父進(jìn)程。如果子進(jìn)程工作得很好并能夠控制,這并不是問(wèn)題。但如果子進(jìn)程已經(jīng)是 defunct,我們就有了一點(diǎn)小麻煩???,原先的父進(jìn)程不可能再 wait(),因?yàn)樗呀?jīng)消亡了。這樣,init 怎么知道 wait() 這些 zombie 進(jìn)程。 
  答案:不可預(yù)料的。在一些系統(tǒng)上,init周期性的破壞掉它所有的defunct進(jìn)程。在另外一些系統(tǒng)中,它干脆拒絕成為任何defunct進(jìn)程的父進(jìn)程,而是馬上毀滅它們。如果你使用上述系統(tǒng)的一種,可以寫一個(gè)簡(jiǎn)單的循環(huán),用屬于init的defunct進(jìn)程填滿進(jìn)程表。這大概不會(huì)令你的系統(tǒng)管理員很高興吧? 
  你的任務(wù):確定你的父進(jìn)程不要忽略 SIGCLD,也不要 wait() 它 fork() 的所有進(jìn)程。不過(guò),你也未必 要 總是這樣做(比如,你要起一個(gè) daemon 或是別的什么東西),但是你必須小心編程,如果你是一個(gè) fork() 的新手。另外,也不要在心理上有任何束縛。 
  總結(jié): 
  子進(jìn)程成為 defunct 直到父進(jìn)程 wait(),除非父進(jìn)程忽略了 SIGCLD 。 
  更進(jìn)一步,父進(jìn)程沒(méi)有 wait() 就消亡(仍假設(shè)父進(jìn)程沒(méi)有忽略 SIGCLD )的子進(jìn)程(活動(dòng)的或者 defunct)成為 init 的子進(jìn)程,init 用重手法處理它們。
zt:http://blog.csdn.net/eroswang/archive/2008/11/19/3333617.aspx
posted on 2011-03-17 21:56 baby-fly 閱讀(886) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Ubuntu&Linux
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲丝袜av一区| 欧美亚洲免费在线| 久久综合伊人77777麻豆| 亚洲欧美日韩在线综合| 麻豆精品精品国产自在97香蕉| 亚洲第一免费播放区| 亚洲精品乱码视频| 久久久精品网| 欧美三级欧美一级| 在线播放不卡| 欧美成va人片在线观看| 亚洲精选一区| 一区久久精品| 亚洲黄色毛片| 久久久久国内| 中文无字幕一区二区三区| 噜噜噜91成人网| 国产综合香蕉五月婷在线| 亚洲免费在线精品一区| 亚洲电影在线播放| 久久久国产精品亚洲一区| 国产精品激情偷乱一区二区∴| 亚洲国产欧美一区| 欧美/亚洲一区| 久久久国产一区二区| 欧美日韩国产美| 亚洲久久一区二区| 亚洲高清免费视频| 久久久www成人免费无遮挡大片 | 亚洲精品免费一区二区三区| 久久人人爽国产| 国产一区亚洲| 亚洲欧美在线x视频| 欧美激情va永久在线播放| 欧美一区二区啪啪| 国产亚洲欧美激情| 久久精品91久久久久久再现| 亚洲砖区区免费| 国产免费亚洲高清| 欧美在线国产| 性色av一区二区三区在线观看| 国产乱肥老妇国产一区二| 先锋亚洲精品| 亚洲欧美在线视频观看| 欧美乱妇高清无乱码| av不卡在线| 在线亚洲高清视频| 国产精品亚洲精品| 久久视频在线看| 久久亚洲精选| 99精品国产在热久久| 亚洲乱亚洲高清| 国产精品成人在线| 亚洲视频自拍偷拍| 一本色道久久加勒比精品| 国产精品一级二级三级| 久久久久九九视频| 免费在线观看一区二区| 日韩小视频在线观看专区| 亚洲午夜91| 在线欧美日韩精品| 一区二区激情| 激情综合久久| 久色婷婷小香蕉久久| 欧美高清视频免费观看| 午夜精品一区二区三区在线视 | 亚洲一区二区久久| 亚洲视频观看| 欧美精品免费看| 日韩亚洲一区二区| 亚洲一区二区三区激情| 国产亚洲欧美一级| 欧美成人精品不卡视频在线观看 | 久久综合五月天婷婷伊人| 亚洲精选在线| 午夜精品婷婷| 999在线观看精品免费不卡网站| 亚洲国产精品一区| 国产精品v亚洲精品v日韩精品 | 欧美wwwwww| 国产精品久久久对白| 免费成人毛片| 国产精品永久免费在线| 美女黄网久久| 国产精品久久影院| 欧美激情在线观看| 国内激情久久| 亚洲色图综合久久| 亚洲春色另类小说| 亚洲午夜久久久久久久久电影院| 亚洲第一网站免费视频| 午夜精品短视频| 亚洲一区二区av电影| 奶水喷射视频一区| 久久久视频精品| 国产精品高潮呻吟视频| 亚洲国产精品va在线观看黑人| 国产人成一区二区三区影院| 亚洲精品综合在线| 亚洲欧洲日本在线| 久久夜色撩人精品| 久久久久久久久久看片| 国产精品久久久久久超碰| 亚洲欧洲免费视频| 国产一区二区中文字幕免费看| 亚洲小视频在线观看| 日韩视频一区二区三区| 免费一区视频| 欧美.日韩.国产.一区.二区| 国产一区二区三区网站| 亚洲免费一区二区| 亚洲一区国产视频| 欧美吻胸吃奶大尺度电影| 亚洲欧洲精品成人久久奇米网| 国产精品一卡| 亚洲欧美日韩高清| 欧美在线地址| 国产视频一区二区三区在线观看| 欧美日韩国产一级| 欧美福利精品| 欧美a级片网| 亚洲电影免费观看高清完整版| 欧美激情精品久久久久久久变态| 国产一区二区视频在线观看| 午夜精品久久久久久久99水蜜桃 | 欧美三级网址| 一区二区三区四区国产| 亚洲手机成人高清视频| 国产亚洲精品久久久久动| 久久一区国产| 亚洲午夜精品一区二区三区他趣| 麻豆精品视频在线| 亚洲一区二区3| 伊人精品成人久久综合软件| 欧美日韩国产精品| 久久se精品一区精品二区| 亚洲国产高清视频| 欧美一区在线看| 亚洲精品久久久久| 国产伦精品一区二区三区免费迷 | 一区二区三区福利| 曰韩精品一区二区| 国产精品夜夜夜| 欧美激情精品久久久久久久变态| 西瓜成人精品人成网站| 亚洲精品乱码久久久久久按摩观| 久久久久欧美精品| 亚洲天堂av在线免费观看| 极品少妇一区二区三区精品视频| 欧美乱大交xxxxx| 久久久久久久精| 亚洲一区二区三区成人在线视频精品 | 亚洲精品美女在线| 国产真实乱偷精品视频免| 欧美日韩精品中文字幕| 久久在线91| 久久av资源网| 亚洲欧美日韩精品久久久| 亚洲精品一区二区在线观看| 免费在线播放第一区高清av| 欧美在线视频免费观看| 中日韩男男gay无套| 亚洲国产欧美日韩另类综合| 国产亚洲激情在线| 国产模特精品视频久久久久| 欧美日本三区| 欧美精品 日韩| 久久这里只有| 久久久欧美一区二区| 亚洲欧美成aⅴ人在线观看| 亚洲美女一区| 亚洲人午夜精品免费| 欧美成人午夜视频| 欧美高清在线一区| 亚洲高清二区| 亚洲国产日韩欧美在线99 | 欧美大片va欧美在线播放| 久久人人爽国产| 久久精品中文字幕一区| 欧美资源在线观看| 久久精品五月婷婷| 久久久夜精品| 免费视频久久| 亚洲成人在线网| 亚洲国产另类久久精品| 欧美成黄导航| 亚洲精品一线二线三线无人区| 亚洲国产精品一区二区www| 激情欧美一区| 亚洲国产欧美一区| 亚洲精品综合| 亚洲婷婷综合久久一本伊一区| 一区二区免费在线视频| 亚洲视频一区二区| 性伦欧美刺激片在线观看| 午夜视频久久久| 久久综合一区二区| 亚洲电影在线播放| 99re视频这里只有精品| 午夜精品久久久久久久99热浪潮 |