2010-10-04 255 views
12

心中已經對殭屍的一些問題處理殭屍進程

  • 從什麼殭屍進程概念的好處是什麼?
  • 知道內核維護(PID,終止狀態,資源使用信息)殭屍進程
    什麼的「資源使用信息」
  • 如何殭屍的PPID()= 1,它仍然殭屍的意思,(INIT收穫殭屍,因爲它等待()默認)
    可以任何一個寫一些C代碼作出殭屍它的父母是初始?
  • 殭屍可以拒絕釋放內存鎖嗎?

由於事先

+0

屬於superuser.com – 2010-10-04 17:46:18

+10

@Paul R我不這麼認爲,這件事情是根據系統編程進行的。 – Searock 2010-10-04 17:54:30

回答

12

- 殭屍過程概念有什麼好處?

殭屍進程只是一個pid,退出狀態和一些會計信息,直到父母使用wait系列調用系列之一才能獲得其最終狀態。在父母呼叫wait之前,孩子的進程ID必須保持標記爲已使用狀態,以便不能爲其分配任何其他進程。如果另一個進程被分配了一個回收的pid,那麼很難區分它和以前具有相同pid的進程之間的區別。一旦父母調用wait並返回最終退出狀態,可以假定沒有人會再次在該pid處查找孩子,所以現在可以重新使用該pid。 (我想在Linux上,如果父母離開SIGCHLD爲SIG_IGN內核將不會保持周圍的殭屍,但重新註冊SIGCHLD的配置爲SIG_IGN不會有同樣的效果)

- 知道內核維護(PID ,終止狀態,資源使用信息)殭屍進程什麼的「資源使用信息」

有些信息是什麼運行的程序的含義:

time my_program 

將報告。這些值通常在SIGCHLD的siginfo結構中報告(它不完全是對wait的調用),但也可通過調用系統調用(在某些系統上)的waitid形式獲得。有關此結構的信息,請參閱man sigaction

- 殭屍的PPID()如何= 1,它仍然殭屍,(INIT收割植物大戰殭屍,因爲它等待()默認情況下)

殭屍其PPID = 1不應該留一個殭屍很長時間,因爲init應該很快收穫。一個殭屍程序在它死後不久(即通過exit或殺死它的無用信號),直到它的父母呼叫wait並獲得它的最終狀態後,它仍然是殭屍。這意味着,即使init不做任何事情,但會一次又一次地調用init,可能會有少量時間將進程顯示爲殭屍。如果進程顯示爲init(0 = ppid)的子進程長時間(秒),則可能有錯誤。

- 任何一個可以寫一些C代碼來做一個殭屍它的父母是Init?

這是不明確的,但我想你想:

pid_t f = fork(); 
if (f > 0) { 
    exit(0); // this is the parent dying, so the child will be an orphan 
      // and get adopted by init 
} else if (f == 0) { 
    sleep(100); // This is the child doing something that takes enough time for 
       // its parent to commit suicide (exit(0)) and then for you to 
       // observe that it has now been adopted by init 
    exit(0); // And now it dyes as well, so init should reap its status, but 
       // it may be a zombie for a short amount of time first. 
} else /* error condition would be handled here */ 

- 可殭屍拒絕釋放內存的一些鎖?

殭屍不能容納任何東西。他們失去了所有的內存頁面,打開文件句柄等等。幾乎所有的操作系​​統都可以弄清楚如何釋放應該被釋放。這不是一個錯誤,但要記住,操作系統必須知道它是應該被釋放的東西。在用戶空間創建資源非常簡單,當程序死亡時應該釋放操作系統不知道應該釋放的資源。

+0

看@這個,你會知道我的意思關於第3點http://stackoverflow.com/questions/1907775/init-never-reaping-zombie-defunct-processes – Aboelnour 2010-10-04 19:35:08

+3

@Aboelnour:或者有一個或多個內核錯誤或_init_,出於某種原因,_init_已經死亡(我不知道如果_init_死了會發生什麼),根發送SIGSTP到_init_,或者_init_運行速度非常慢。這不應該發生。 – nategoose 2010-10-04 20:20:42

3

甲殭屍進程是一個純粹的PID和退出狀態值。由於資源(pid)「屬於」父項,因此無法釋放pid。如果它被釋放,另一個進程可能會被分配相同的pid,然後父進程可能會發送信號到一個不相關的進程;即使父母第一次等待確定孩子是否退出,也無法避免競爭條件。

+0

...我想我錯過了一些東西。你正在從事什麼殭屍進程的定義? – 2010-10-04 17:46:54

+2

已退出,但其父母未通過「waitpid」或類似接口獲得退出狀態通知的子進程。 – 2010-10-04 17:56:35

+0

啊,是的。抱歉。我只是意識到我一直在讀「殭屍」,並想着「孤兒」。謝謝。 – 2010-10-04 18:16:16

2

如果您有興趣瞭解正在運行的進程列表中的殭屍進程使用:

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 

int main(void) 
{ 
    pid_t p = fork(); // creates child process and stores the returned PID 

    if (p != 0)   // executed by parent process 
    { sleep(1);  /* the child process terminates while the parent process sleeps, 
          the child then becomes a zombie process because the returned status 
          of the terminated child process isn't checked via a wait() */ 

     system("ps -eo pid,ppid,stat,cmd"); // prints a list of processes in your terminal 

    } 
    else  // executed by child process 
    { 
     exit(0);  // the child process terminates immediately 
    } 

    return 0; 
} 

您可以通過Z +識別殭屍進程列表:

screenshot of the zombie process

注意:如果您使用的是Windows,則必須修改代碼。