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

為生存而奔跑

   :: 首頁 :: 聯系 :: 聚合  :: 管理
  271 Posts :: 0 Stories :: 58 Comments :: 0 Trackbacks

留言簿(5)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 331733
  • 排名 - 74

最新評論

閱讀排行榜

評論排行榜

  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兩次在防止僵死方面來說,就是因為兒子進程先退出,孫子進程就被init接管了,實際上與最初的父進程脫離了關系,就不會僵死了。見APUE 的P151以下描述:

回憶一下8 . 5節中有關僵死進程的討論。如果一個進程要f o r k一個子進程,但不要求它等待
子進程終止,也不希望子進程處于僵死狀態直到父進程終止,實現這一要求的訣竅是調用f o r k
兩次。程序8 - 5實現了這一點。
在第二個子進程中調用s l e e p以保證在打印父進程I D時第一個子進程已終止。在f o r k之后,
父、子進程都可繼續執行——我們無法預知哪一個會先執行。如果不使第二個子進程睡眠,則
在f o r k之后,它可能比其父進程先執行,于是它打印的父進程I D將是創建它的父進程,而不是
i n i t進程(進程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. }  

關于僵尸進程:

  在fork()/execve()過程中,假設子進程結束時父進程仍存在,而父進程fork()之前既沒安裝SIGCHLD信號處理函數調用waitpid()等待子進程結束,又沒有顯式忽略該信號,則子進程成為僵尸進程,無法正常結束,此時即使是root身份kill -9也不能殺死僵尸進程。補救辦法是殺死僵尸進程的父進程(僵尸進程的父進程必然存在),僵尸進程成為"孤兒進程",過繼給1號進程init,init始終會負責清理僵尸進程。

  僵尸進程是指的父進程已經退出,而該進程dead之后沒有進程接受,就成為僵尸進程.(zombie)進程 
  怎樣產生僵尸進程的: 
  一個進程在調用exit命令結束自己的生命的時候,其實它并沒有真正的被銷毀,而是留下一個稱為僵尸進程(Zombie)的數據結構(系統調用exit,它的作用是使進程退出,但也僅僅限于將一個正常的進程變成一個僵尸進程,并不能將其完全銷毀)。在Linux進程的狀態中,僵尸進程 
  是非常特殊的一種,它已經放棄了幾乎所有內存空間,沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留一個位置,記載該進程的退 
  出狀態等信息供其他進程收集,除此之外,僵尸進程不再占有任何內存空間。它需要它的父進程來為它收尸,如果他的父進程沒安裝SIGCHLD信 
  號處理函數調用wait或waitpid()等待子進程結束,又沒有顯式忽略該信號,那么它就一直保持僵尸狀態,如果這時父進程結束了,那么init進程自動 
  會接手這個子進程,為它收尸,它還是能被清除的。但是如果如果父進程是一個循環,不會結束,那么子進程就會一直保持僵尸狀態,這就是為什么系統中有時會有很多的僵尸進程。 
  怎么查看僵尸進程: 
  利用命令ps,可以看到有標記為Z的進程就是僵尸進程。 
  怎樣來清除僵尸進程: 
  1.改寫父進程,在子進程死后要為它收尸。具體做法是接管SIGCHLD信號。子進程死后,會發送SIGCHLD信號給父進程,父進程收到此信號后,執行waitpid()函數為子進程收尸。這是基于這樣的原理:就算父進程沒有調用wait,內核也會向它發送SIGCHLD消息,盡管對的默認處理是忽略,如果想響應這個消息,可以設置一個處理函數。 
  2.把父進程殺掉。父進程死后,僵尸進程成為"孤兒進程",過繼給1號進程init,init始終會負責清理僵尸進程.它產生的所有僵尸進程也跟著消失。
  =========================================== 
  在Linux中可以用 
  ps auwx 
  發現僵尸進程 
  a all w/ tty, including other users 所有窗口和終端,包括其他用戶的進程 
  u user-oriented 面向用戶(用戶友好) 
  -w,w wide output 寬格式輸出 
  x processes w/o controlling ttys 
  在僵尸進程后面 會標注 
  ps axf 
  看進程樹,以樹形方式現實進程列表 
  ps axm 
  會把線程列出來,在linux下進程和線程是統一的,是輕量級進程的兩種方式。 
  ps axu 
  顯示進程的詳細狀態 
  =========================================== 
  killall 
  kill -15 
  kill -9 
  一般都不能殺掉 defunct進程 
  用了kill -15,kill -9以后 之后反而會多出更多的僵尸進程 
  kill -kill pid 
  fuser -k pid 
  可以考慮殺死他的parent process, 
  kill -9 他的parent process 
  =========================================== 
  一個已經終止,但是其父進程尚未對其進行善后處理(獲取終止子進程的有關信息、釋放它仍占用的資源)的進程被稱為僵死進程(Zombie Process)。 
  避免zombie的方法: 
  1)在SVR4中,如果調用signal或sigset將SIGCHLD的配置設置為忽略,則不會產生僵死子進程。另外,使用SVR4版的sigaction,則可設置SA_NOCLDWAIT標志以避免子進程僵死。 
  Linux中也可使用這個,在一個程序的開始調用這個函數 
  signal(SIGCHLD,SIG_IGN); 
  2)調用fork兩次。程序8 - 5 實現了這一點。 
  3)用waitpid等待子進程返回. 
  =========================================== 
  zombie進程是僵死進程。防止它的辦法,一是用wait,waitpid之類的函數獲得 
  進程的終止狀態,以釋放資源。另一個是fork兩次 
  =========================================== 
  defunct進程只是在process table里還有一個記錄,其他的資源沒有占用,除非你的系統的process個數的限制已經快超過了,zombie進程不會有更多的壞處。 
  可能唯一的方法就是reboot系統可以消除zombie進程。 
  =========================================== 
  任何程序都有僵尸狀態,它占用一點內存資源(也就是進程表里還有一個記錄),僅僅是表象而已不必害怕。如果程序有問題有機會遇見,解決大批量僵尸簡單有效的辦法是重起。kill是無任何效果的 
  fork與zombie/defunct" 
  在Unix下的一些進程的運作方式。當一個進程死亡時,它并不是完全的消失了。進程終止,它不再運行,但是還有一些殘留的小東西等待父進程收回。這些殘留的東西包括子進程的返回值和其他的一些東西。當父進程 fork() 一個子進程后,它必須用 wait() 或者 waitpid() 等待子進程退出。正是這個 wait() 動作來讓子進程的殘留物消失。 
  自然的,在上述規則之外有個例外:父進程可以忽略 SIGCLD 軟中斷而不必要 wait()。可以這樣做到(在支持它的系統上,比如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.  }    
    現在,子進程死亡時父進程沒有 wait(),通常用 ps 可以看到它被顯示為“”。它將永遠保持這樣 直到 父進程 wait(),或者按以下方法處理。 
  這里是你必須知道的另一個規則:當父進程在它wait()子進程之前死亡了(假定它沒有忽略 SIGCLD),子進程將把 init(pid 1)進程作為它的父進程。如果子進程工作得很好并能夠控制,這并不是問題。但如果子進程已經是 defunct,我們就有了一點小麻煩。看,原先的父進程不可能再 wait(),因為它已經消亡了。這樣,init 怎么知道 wait() 這些 zombie 進程。 
  答案:不可預料的。在一些系統上,init周期性的破壞掉它所有的defunct進程。在另外一些系統中,它干脆拒絕成為任何defunct進程的父進程,而是馬上毀滅它們。如果你使用上述系統的一種,可以寫一個簡單的循環,用屬于init的defunct進程填滿進程表。這大概不會令你的系統管理員很高興吧? 
  你的任務:確定你的父進程不要忽略 SIGCLD,也不要 wait() 它 fork() 的所有進程。不過,你也未必 要 總是這樣做(比如,你要起一個 daemon 或是別的什么東西),但是你必須小心編程,如果你是一個 fork() 的新手。另外,也不要在心理上有任何束縛。 
  總結: 
  子進程成為 defunct 直到父進程 wait(),除非父進程忽略了 SIGCLD 。 
  更進一步,父進程沒有 wait() 就消亡(仍假設父進程沒有忽略 SIGCLD )的子進程(活動的或者 defunct)成為 init 的子進程,init 用重手法處理它們。
zt:http://blog.csdn.net/eroswang/archive/2008/11/19/3333617.aspx
posted on 2011-03-17 21:56 baby-fly 閱讀(886) 評論(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>
            欧美不卡在线视频| 日韩性生活视频| 欧美激情一区二区三区在线| 午夜在线一区二区| 久久精品国产免费| 牛牛影视久久网| 欧美激情在线有限公司| 亚洲精品久久久一区二区三区| 亚洲欧洲精品一区二区三区波多野1战4| 亚洲第一中文字幕| 一区二区三区四区在线| 欧美一区二区视频在线观看| 久久这里只精品最新地址| 欧美伦理影院| 国产亚洲成年网址在线观看| 亚洲人午夜精品| 亚洲一区二区av电影| 久久一区二区三区国产精品 | 日韩亚洲欧美高清| 午夜亚洲福利在线老司机| 久久天天躁狠狠躁夜夜爽蜜月| 你懂的国产精品| 亚洲一区二区影院| 蜜臀av性久久久久蜜臀aⅴ| 欧美日韩一区二区视频在线| 国产日韩亚洲| 亚洲图片激情小说| 欧美成人精品| 午夜在线电影亚洲一区| 欧美大片在线观看| 国产综合久久久久影院| 中文国产成人精品| 欧美成人久久| 欧美在线日韩| 国产精品视频网站| 99国产精品久久| 欧美日韩国产a| 国内精品久久久久国产盗摄免费观看完整版 | 欧美高清在线播放| 欧美在线视频播放| 国产精品久久久一区麻豆最新章节| 亚洲成人直播| 久久久91精品国产一区二区精品| 亚洲毛片在线看| 老司机久久99久久精品播放免费 | 欧美日韩国产综合视频在线观看| 国产在线日韩| 香蕉久久夜色精品国产使用方法| 91久久综合| 欧美顶级少妇做爰| 亚洲女同同性videoxma| 在线看欧美日韩| 亚洲欧洲综合另类| 亚洲欧美在线x视频| 欧美日韩不卡视频| 亚洲高清视频一区二区| 久久亚洲综合| 久久久国产精彩视频美女艺术照福利 | 久久躁日日躁aaaaxxxx| 欧美视频在线观看视频极品| 亚洲电影免费在线 | 亚洲欧美精品| 国产精品久久久久久久午夜 | 一区二区三区免费网站| 亚洲激情网站| 欧美日韩成人精品| 久久久亚洲成人| 国产一区二区三区在线免费观看 | 中文av一区二区| 一区二区三区欧美在线| 国产精品白丝黑袜喷水久久久 | 欧美成人国产| 欧美激情1区| 亚洲欧美成人精品| 亚洲欧美一区二区精品久久久| 国产精品专区h在线观看| 久久成人免费视频| 乱码第一页成人| 亚洲区在线播放| 亚洲欧洲在线观看| 国产精品白丝jk黑袜喷水| 欧美在线观看一二区| 久久精品一级爱片| 亚洲美女在线一区| 亚洲伊人伊色伊影伊综合网| 国产亚洲激情| 亚洲国产中文字幕在线观看| 欧美日本不卡高清| 久久精品国产久精国产一老狼| 久久青草福利网站| 亚洲视频一区在线| 欧美一级在线播放| 日韩网站在线| 亚洲欧美国产另类| 在线日韩av片| 亚洲午夜影视影院在线观看| 在线免费精品视频| 一区二区三区欧美| 在线欧美小视频| 在线视频日本亚洲性| 999亚洲国产精| 欧美成人亚洲成人| 午夜精品福利一区二区三区av | 亚洲直播在线一区| 久久久久久久999| 亚洲欧美综合网| 欧美精品午夜视频| 久久综合中文| 国产精品乱码一区二区三区| 欧美+亚洲+精品+三区| 欧美视频在线观看| 欧美激情中文字幕一区二区| 国产免费亚洲高清| 亚洲精品日韩激情在线电影 | 久久色在线播放| 亚洲欧美久久久| 欧美日韩高清在线播放| 久久综合九色99| 国产乱码精品1区2区3区| 亚洲国产一区二区三区在线播 | 日韩一级黄色片| 亚洲国产网站| 久久精品中文字幕一区二区三区| 欧美在线看片| 国产精品不卡在线| 亚洲精品久久久久久久久久久久| 国产在线日韩| 午夜一区二区三区不卡视频| 亚洲一区二区视频在线| 欧美黑人国产人伦爽爽爽| 欧美成人精精品一区二区频| 国产日韩精品久久| 亚洲午夜小视频| 午夜视频在线观看一区二区| 欧美日韩久久精品| 日韩视频精品在线观看| 亚洲靠逼com| 欧美精品七区| 最近中文字幕mv在线一区二区三区四区 | 久久久夜夜夜| 免费看成人av| 亚洲国产欧美一区二区三区同亚洲| 久久久亚洲高清| 欧美成人性网| 亚洲精品视频一区| 欧美激情一区二区三区在线视频| 亚洲风情在线资源站| 最新国产の精品合集bt伙计| 免费久久99精品国产| 亚洲福利精品| 一级日韩一区在线观看| 国产精品国产三级国产专播品爱网 | 亚洲欧美日韩精品在线| 久久久午夜精品| 欧美aⅴ一区二区三区视频| 在线观看国产精品淫| 免费欧美电影| 亚洲精品美女91| 亚洲综合电影| 韩国成人理伦片免费播放| 久久久久欧美精品| 最新日韩在线视频| 亚洲男人天堂2024| 国内精品一区二区三区| 老色批av在线精品| 亚洲品质自拍| 亚洲自拍偷拍色片视频| 国产一区二区av| 免费观看在线综合色| 一本色道久久99精品综合| 久久九九有精品国产23| 亚洲激情影视| 国产精品高潮呻吟视频| 久久国产精品第一页| 亚洲欧洲一区二区天堂久久| 欧美一级黄色录像| 亚洲经典三级| 国产美女诱惑一区二区| 欧美成人激情视频| 欧美尤物巨大精品爽| 亚洲精品中文字幕有码专区| 欧美主播一区二区三区| 亚洲看片网站| 韩国精品在线观看| 欧美视频在线一区二区三区| 久久精品国产清自在天天线| 亚洲另类视频| 激情欧美日韩一区| 国产麻豆精品视频| 欧美日韩精品免费在线观看视频| 久久久国产精品一区二区三区| 一区二区日韩欧美| 亚洲国产精品黑人久久久| 久久久99精品免费观看不卡| 一区二区三区高清在线观看| 在线观看日韩www视频免费| 国产亚洲欧美日韩精品| 国产精品美女在线观看| 欧美美女福利视频| 欧美成人免费全部观看天天性色|