在某些應用中常會需要執行其他的程式,這時候就會需要呼叫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 */
沒有留言:
張貼留言