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

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

  僵尸進程是指的父進程已經退出,而該進程dead之后沒有進程接受,就成為僵尸進程.(zombie)進程

  怎樣產生僵尸進程的:

  一個進程在調用exit命令結束自己的生命的時候,其實它并沒有真正的被銷毀,而是留下一個稱為僵尸進程(Zombie)的數據結構(系統調用 exit,它的作用是使進程退出,但也僅僅限于將一個正常的進程變成一個僵尸進程,并不能將其完全銷毀)。在Linux進程的狀態中,僵尸進程是非常特殊的一種,它已經放棄了幾乎所有內存空間,沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留一個位置,記載該進程的退出狀態等信息供其他進程收集,除此之外,僵尸進程不再占有任何內存空間。它需要它的父進程來為它收尸,如果他的父進程沒安裝SIGCHLD信號處理函數調用wait或waitpid()等待子進程結束,又沒有顯式忽略該信號,那么它就一直保持僵尸狀態,如果這時父進程結束了,那么init進程自動會接手這個子進程,為它收尸,它還是能被清除的。但是如果如果父進程是一個循環,不會結束,那么子進程就會一直保持僵尸狀態,這就是為什么系統中有時會有很多的僵尸進程。

  Linux系統對運行的進程數量有限制,如果產生過多的僵尸進程占用了可用的進程號,將會導致新的進程無法生成。這就是僵尸進程對系統的最大危害。

  僵尸進程實例:

  /*-----zombie1.c-----*/

  #include "sys/types.h"

  #include "sys/wait.h"

  #include "stdio.h"

  #include "unistd.h"

  int main(int argc, char* argv[])

  {

          while(1)

          {

                 pid_t chi = fork();

                  if(chi == 0)

                  {

                          execl("/bin/bash","bash","-c","ls",NULL);

                  }

                  sleep(2);

  }

  會不停地產生僵死進程ls;

  /*-----zombie2.c-----*/

  #include <stdio.h>

  #include<sys/types.h>

  main()

  {

          if(!fork())

          {

                  printf("child pid=%d\n", getpid());

                  exit(0);

          }

          /*wait();*/

          /*waitpid(-1,NULL,0);*/

          sleep(60);

          printf("parent pid=%d \n", getpid());

          exit(0);

  }

  60s內會不斷產生僵尸進程,直到父進程exit(0);

  如果在調用wait/waitpid來為子進程收尸,就不會產生僵尸進程了。

  PS:運行例子,先gcc zombie1.c -o zombie編譯,然后運行zombie;

  然后可以可用ps -ef來查看是否產生了僵尸進程。

  怎么查看僵尸進程:

  利用命令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):

  main()

  {

  signal(SIGCLD, SIG_IGN); /* now I don't have to wait()! */

fork();

  fork();

  fork(); /* Rabbits, rabbits, rabbits! */

 ?。?/p>

  現在,子進程死亡時父進程沒有 wait(),通常用 ps 可以看到它被顯示為“”。它將永遠保持這樣 直到 父進程 wait(),或者按以下方法處理。

  這里是你必須知道的另一個規則:當父進程在它wait()子進程之前死亡了(假定它沒有忽略 SIGCLD),子進程將把 init(pid1)進程作為它的父進程。如果子進程工作得很好并能夠控制,這并不是問題。但如果子進程已經是defunct,我們就有了一點小麻煩。 看,原先的父進程不可能再 wait(),因為它已經消亡了。這樣,init 怎么知道 wait() 這些zombie 進程。

  答案:不可預料的。在一些系統上,init周期性的破壞掉它所有的defunct進程。在另外一些系統中,它干脆拒絕成為任何defunct進 程的父進程,而是馬上毀滅它們。如果你使用上述系統的一種,可以寫一個簡單的循環,用屬于init的defunct進程填滿進程表。這大概不會令你的系統 管理員很高興吧?

  你的任務:確定你的父進程不要忽略 SIGCLD,也不要 wait() 它 fork() 的所有進程。不過,你也未必 要總是這樣做(比如,你要起一個 daemon 或是別的什么東西),但是你必須小心編程,如果你是一個 fork()的新手。另外,也不要在心理上有任何束縛。

  總結:

  子進程成為 defunct 直到父進程 wait(),除非父進程忽略了 SIGCLD 。

  更進一步,父進程沒有 wait() 就消亡(仍假設父進程沒有忽略 SIGCLD )的子進程(活動的或者 defunct)成為 init 的子進程,init 用重手法處理它們。


from:

http://linux.chinaitlab.com/administer/818916.html


posted on 2010-08-26 17:09 chatler 閱讀(683) 評論(0)  編輯 收藏 引用 所屬分類: Linux_Coding
<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

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>
            性色av一区二区三区| 国产亚洲高清视频| 欧美日本成人| 国产婷婷色一区二区三区在线| 红桃视频一区| 亚洲特色特黄| 欧美激情中文字幕乱码免费| 亚洲一级特黄| 欧美激情精品| 亚洲成色777777在线观看影院| 亚洲欧美日韩系列| 亚洲精品一区二区在线| 久久天天躁狠狠躁夜夜爽蜜月| 国产精品乱码妇女bbbb| 99精品欧美一区二区三区综合在线| 久久久久久久久久久成人| 一区二区三区视频免费在线观看| 免费欧美在线| 尤妮丝一区二区裸体视频| 欧美一区二区三区免费大片| 日韩网站在线观看| 欧美国产先锋| 午夜一区二区三区在线观看| 性做久久久久久免费观看欧美| 欧美午夜影院| 亚洲一区在线观看视频| 亚洲精品在线免费| 国产欧美日韩视频一区二区| 午夜欧美视频| 亚洲欧美国产精品va在线观看| 欧美日韩在线亚洲一区蜜芽| 一本大道久久a久久综合婷婷| 亚洲国产欧美一区| 久久九九免费视频| 免费中文字幕日韩欧美| 亚洲欧美日韩国产中文| 美女在线一区二区| 亚洲精品视频二区| 亚洲精品乱码久久久久久按摩观| 欧美成人激情视频免费观看| 亚洲区国产区| 亚洲精品影院| 经典三级久久| 91久久精品网| 国产精品成av人在线视午夜片| 久久综合给合| 欧美福利在线观看| 久久久久一本一区二区青青蜜月| 久久久www免费人成黑人精品 | 亚洲欧美成人在线| 亚洲精品一区二区三区蜜桃久| 午夜在线播放视频欧美| 亚洲一级二级| 午夜精品久久久久久久| 国内精品美女在线观看| 欧美国产视频日韩| 国产一区二区三区网站| 亚洲在线国产日韩欧美| 狠狠做深爱婷婷久久综合一区 | 欧美激情第9页| 国产性猛交xxxx免费看久久| 亚洲一级二级在线| 亚洲亚洲精品三区日韩精品在线视频| 欧美电影免费网站| 亚洲国产va精品久久久不卡综合| 欧美日韩性视频在线| 久久国产精品亚洲va麻豆| 另类激情亚洲| 亚洲一区影院| 国产精品爱啪在线线免费观看| 亚洲免费不卡| 亚洲一区二区三区久久| 国产精品久久久久久久久搜平片 | 亚洲欧美日韩精品久久奇米色影视| 亚洲中字在线| 欧美偷拍另类| 亚洲在线观看| 久久香蕉精品| 亚洲激情偷拍| 久久精品成人欧美大片古装| 亚洲视频电影在线| 国产精品日韩在线| 亚洲人体1000| 亚洲欧美日韩中文在线制服| 国产精品久久久一区二区| 亚洲欧美国内爽妇网| 久久久精品日韩| 亚洲国产成人av好男人在线观看| 亚洲欧美日韩国产一区二区三区| 久久av在线看| 国产精品久久7| 91久久精品国产91性色| 亚洲一区欧美| 国产真实久久| 欧美成人免费va影院高清| 中日韩美女免费视频网站在线观看| 亚洲国产精品成人综合| 欧美激情综合网| 亚洲丶国产丶欧美一区二区三区| 中文无字幕一区二区三区| 国产精品久久一卡二卡| 久久久精品动漫| a4yy欧美一区二区三区| 日韩视频一区二区在线观看 | 国产欧美69| 免费不卡在线观看av| 在线午夜精品自拍| 欧美成人r级一区二区三区| 韩国一区二区三区美女美女秀| 久久一本综合频道| 亚洲午夜小视频| 亚洲国产精品视频| 久久久久国产一区二区三区四区| 99精品国产热久久91蜜凸| 国产午夜久久久久| 国产精品av久久久久久麻豆网| 久久久久综合网| 亚洲国产成人久久| 久久久久在线| 亚洲欧美日韩在线不卡| 99re热这里只有精品免费视频| 国产亚洲精品久久久| 欧美色图首页| 欧美激情精品久久久久久久变态| 欧美在线视频免费播放| 欧美成人精品1314www| 午夜视频在线观看一区| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 欧美高清视频一区二区| 日韩天堂在线视频| 今天的高清视频免费播放成人 | 久久亚洲国产成人| 香蕉尹人综合在线观看| 一本色道久久88综合亚洲精品ⅰ| 亚洲第一精品电影| 欧美1区2区| 欧美成人激情视频免费观看| 久久永久免费| 久久人人爽人人爽爽久久| 欧美在线视频在线播放完整版免费观看| 中国成人亚色综合网站| 一区二区成人精品| 激情懂色av一区av二区av| 国产视频欧美| 国产综合精品| 在线免费日韩片| 亚洲国产精品va在看黑人| 亚洲激情婷婷| 日韩视频在线观看| 日韩视频免费大全中文字幕| 亚洲精品国产欧美| 一本色道久久综合亚洲精品按摩| 99精品国产在热久久下载| 亚洲免费观看高清在线观看| 99精品视频一区| 亚洲一区二区在线观看视频| 亚洲免费视频在线观看| 午夜亚洲激情| 久久午夜精品| 亚洲高清不卡在线| 99riav久久精品riav| 亚洲一区久久| 久久久国产精品一区二区三区| 老色鬼久久亚洲一区二区| 欧美多人爱爱视频网站| 欧美日精品一区视频| 国产精品欧美在线| 精品电影在线观看| 亚洲精品国产拍免费91在线| 亚洲一二三区在线| 久久精品五月婷婷| 亚洲国产高清aⅴ视频| 一区二区三区欧美亚洲| 欧美在线观看视频| 欧美va日韩va| 国产精品三级视频| 亚洲第一主播视频| 亚洲尤物精选| 老鸭窝毛片一区二区三区 | 影音先锋成人资源站| 亚洲伦伦在线| 欧美一区成人| 亚洲国产欧美精品| 午夜精品福利一区二区蜜股av| 老司机午夜精品| 国产精品二区二区三区| 羞羞答答国产精品www一本| 久久午夜激情| 亚洲欧美日韩一区二区在线| 亚洲——在线| 国产色产综合产在线视频| 亚洲国产婷婷| 你懂的一区二区| 久久一综合视频| 一区福利视频| 欧美国产日韩在线观看| 美女成人午夜| 日韩亚洲欧美精品| 日韩一级成人av| 国产精品青草久久久久福利99|