so true

          心懷未來(lái),開(kāi)創(chuàng)未來(lái)!
          隨筆 - 160, 文章 - 0, 評(píng)論 - 40, 引用 - 0
          數(shù)據(jù)加載中……

          有關(guān)僵尸進(jìn)程和孤兒進(jìn)程的解釋

              僵尸進(jìn)程:一個(gè)子進(jìn)程在其父進(jìn)程還沒(méi)有調(diào)用wait()或waitpid()的情況下退出。這個(gè)子進(jìn)程就是僵尸進(jìn)程。
              孤兒進(jìn)程:一個(gè)父進(jìn)程退出,而它的一個(gè)或多個(gè)子進(jìn)程還在運(yùn)行,那么那些子進(jìn)程將成為孤兒進(jìn)程。孤兒進(jìn)程將被init進(jìn)程(進(jìn)程號(hào)為1)所收養(yǎng),并由init進(jìn)程對(duì)它們完成狀態(tài)收集工作。
              僵尸進(jìn)程將會(huì)導(dǎo)致資源浪費(fèi),而孤兒則不會(huì)。

          子進(jìn)程持續(xù)10秒鐘的僵尸狀態(tài)(EXIT_ZOMBIE)
          ------------------------------------------------------
          #include <sys/types.h>
          #include <unistd.h>
          #include <stdio.h>
          #include <stdlib.h>

          main()
          {
              pid_t pid;
              pid = fork();
              if(pid < 0)
                  printf("error occurred!"n");
              else if(pid == 0) {
                  printf("Hi father! I'm a ZOMBIE"n");
                  exit(0);      //(1)
              }
              else {
                  sleep(10);
                  wait(NULL);   //(2)
              }
          }

          (1) 向父進(jìn)程發(fā)送SIGCHILD信號(hào)
          (2) 父進(jìn)程處理SIGCHILD信號(hào)

          執(zhí)行exit()時(shí)根據(jù)其父進(jìn)程的狀態(tài)決定自己的狀態(tài):
              如果父進(jìn)程已經(jīng)退出(沒(méi)有wait),則該子進(jìn)程將會(huì)成為孤兒進(jìn)程過(guò)繼給init進(jìn)程
              如果其父進(jìn)程還沒(méi)有退出,也沒(méi)有wait(),那么該進(jìn)程將向父進(jìn)程發(fā)送SIGCHILD信號(hào),進(jìn)入僵尸狀態(tài)等待父進(jìn)程為其收尸。如果父進(jìn)程一直沒(méi)有執(zhí)行wait(),那么該子進(jìn)程將會(huì)持續(xù)處于僵尸狀態(tài)。




          子進(jìn)程將成為孤兒進(jìn)程
          ------------------------------------------------------
          #include <sys/types.h>
          #include <unistd.h>
          #include <stdio.h>
          #include <stdlib.h>

          main()
          {
              pid_t pid;
              pid = fork();
              if(pid < 0)
                  printf("error occurred!"n");
              else if(pid == 0) {
                  sleep(6);
                  printf("I'm a orphan"n");
                  exit(0);
              }
              else {
                  sleep(1);
                  printf("Children Bye!"n");
              }
          }

          # ./a.out
          Children Bye!
          # I'm a orphan
          (回車(chē)后將會(huì)進(jìn)入#)


          上面是我在網(wǎng)上找到的一篇簡(jiǎn)潔又清晰的有關(guān)僵尸/孤兒進(jìn)程的介紹,我再補(bǔ)充點(diǎn)自己的體會(huì):
          任何一個(gè)進(jìn)程退出時(shí),都會(huì)給自己的父進(jìn)程發(fā)送一個(gè)SIGCHLD/SIGCLD,如果父進(jìn)程在創(chuàng)建子進(jìn)程之前調(diào)用了signal(SIGCHLD, SIG_IGN),那么子進(jìn)程將立刻退出,也就不存在什么僵尸進(jìn)程了;對(duì)于上面的第一個(gè)例子,假如在父進(jìn)程中sleep之后沒(méi)有調(diào)用wait,那么由子進(jìn)程發(fā)送過(guò)來(lái)的SIGCHLD信號(hào)也不會(huì)再拋給init進(jìn)程(即,不會(huì)從僵尸進(jìn)程轉(zhuǎn)化為孤兒進(jìn)程);
          父親比孩子死得早,孩子就是孤兒進(jìn)程,因此孤兒進(jìn)程的開(kāi)始不是從子進(jìn)程exit后算的,而是從父進(jìn)程死亡的那一刻算的;
          僵尸進(jìn)程的首要必要條件就是:父親得活著;其次,子進(jìn)程成為僵尸的時(shí)間長(zhǎng)度==父進(jìn)程不搭理子進(jìn)程的時(shí)間長(zhǎng)度(即, 不調(diào)用wait或waitpid)。

          posted on 2010-08-25 14:52 so true 閱讀(1389) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 栾城县| 禹州市| 通江县| 丰城市| 抚州市| 绥江县| 邯郸市| 腾冲县| 金阳县| 陇南市| 张家川| 德清县| 义乌市| 吕梁市| 南靖县| 伊春市| 肇源县| 塔城市| 射洪县| 郓城县| 眉山市| 柘城县| 深州市| 当雄县| 黎川县| 永嘉县| 崇信县| 清镇市| 九台市| 合山市| 永修县| 都兰县| 抚顺市| 莱州市| 天柱县| 和田县| 伊通| 嘉义市| 阿鲁科尔沁旗| 泊头市| 竹北市|