【譯名】死亡處理程序
【說明】每個 UNIX 的處理程序在核心程式的處理程序表裏都擁有一個進入點(entry),當核心程式執行該處理程序時會使用到的一切資訊都儲存在這個進入點內;事實上當您用 ps -ef 指令去顯示統中所有處理程序的資料時,ps 就是從處理程序表中把相關資料找出來。
在我們以 fork() 系統呼叫建立一個新的處理程序後,核心程式會在處理程序表裏找一個進入點給這個新處理程序,然後將一些資訊儲存在這個進入點所對應的處理程序表內。這些資訊裏面有一項是父處理程序的識別碼。當這個處理程序走完了它的生命週期後,它會執行 exit() 系統呼叫,此刻原本處理程序表的資料會被該處理程序的釋出碼(exit code)、執行時所用的 CPU 時間等資料所取代,這些資料會被一直保留到系統將它傳遞給它的父處理程序為止。由此可知 zombie(defunct)處理程序的出現是在子處理程序終止後,但是父處理程序未讀取這些資料前。利用這個原則我們可以用下面的程式建立一個 zombie 處理程序:
1[0] #include <stdio.h>
2[0] #include <sys/types.h>
3[0]
4[0] main()
5[1] {
6[1] pid_t pid;
7[1] switch(pid=fork())
8[2] {
9[2] case -1 :
10[2] perror("fork");
11[2] exit(1);
12[2] case(0) :
13[2] printf("child pid=%d\n",getpid());
14[2] exit(0);
15[2] default :
16[2] sleep(30);
17[1] }
18[1] printf("parent pid=%d\n",getpid());
19[1] exit(0);
20[0] }
讀者可以將此處理程序以幕後的方式來執行,這時您將可以發現有 zombie 的產生。