2011年9月15日 星期四

Avoid zombie process

在某些應用中常會需要執行其他的程式,這時候就會需要呼叫fork產生child process並在此執行其他程式.
而當被呼叫的程式執行結束child process也就跟著結束,這時child process就成為zombie process.

if(fork() == 0) { /* Child process*/
  /* Run program */
  execl("/bin/ntpdate", "ntpdate", "tick.stdtime.gov.tw", "tock.stdtime.gov.tw", (char *)0);
  exit(0);
  /* zombie process */
}

/* Parent process or error */
 
wait(0);

zombie process存在的意義是等待parent process來處理child process結束後的事情,例如程式的傳回值.

有兩種方式來避免zombie process
1.明確指出parent process不需要知道child process的結束狀態
在parent process 程式碼中加上

signal(SIGCHLD, SIG_IGN); /*  Do not wait for child process */

2.連續fork兩次,藉由結束first child process的方式讓second child process的parent process為pid 1  (通常是 init)

pid_t pid;
if((pid = fork()) == 0)  { /*First child process*/
  if((pid = fork()) > 0)
      exit(0); /* Terminate first child process */
  /* Second child process. Run program */
  execl("/bin/ntpdate", "ntpdate", "tick.stdtime.gov.tw", "tock.stdtime.gov.tw", (char *)0);
  exit(0);
}
 
/* Parent process or error */