當我們只fork()一次後,存在父程序和子程序。這時有兩種方法來避免產生殭屍程序:
目前先考慮子程序先於父程序結束的情況:
由此,可以看出父程序與子程序有父子關係,除非保證父程序先於子程序結束或者保證父程序在子程序結束前執行waitpid(),子程序均有機會成為殭屍程序。那麼如何使父程序更方便地建立不會成為殭屍程序的子程序呢?這就要用兩次fork()了。
父程序一次fork()後產生乙個子程序隨後立即執行waitpid(子程序pid, null, 0)來等待子程序結束,然後子程序fork()後產生孫子程序隨後立即exit(0)。這樣子程序順利終止(父程序僅僅給子程序收屍,並不需要子程序的返回值),然後父程序繼續執行。這時的孫子程序由於失去了它的父程序(即是父程序的子程序),將被轉交給init程序託管。於是父程序與孫子程序無繼承關係了,它們的父程序均為init,init程序在其子程序結束時會自動收屍,這樣也就不會產生殭屍程序了。
[cpp]view plain
copy
print?
#include
#include
#include
#include
intmain(
void
)
else
if(pid == 0)
/* first child */
else
if(pid > 0)
exit(0); /* parent from second fork == first child */
/*
* we're the second child; our parent becomes init as soon
* as our real parent calls exit() in the statement above.
* here's where we'd continue executing, knowing that when
* we're done, init will reap our status.
*/sleep(2);
printf("second child, parent pid = %d/n"
, getppid());
exit(0);
}
if(waitpid(pid, null, 0) != pid)
/* wait for first child */
/*
* we're the parent (the original process); we continue executing,
* knowing that we're not the parent of the second child.
*/exit(0);
}
呼叫fork兩次以避免僵死程序
如果乙個程序fork乙個子程序,但不要它等待子程序終止,也不希望子程序處於僵死狀態直到父程序終止,實現這一要求的技巧是呼叫fork2次。下面是例項 include include include int main void else if pid 0 if waitpid pid,null,0 pi...
apue 8 5呼叫fork兩次以避免僵死程序
呼叫fork兩次以避免僵死程序 include apue.h include int main void else if pid 0 sleep 20 printf second child,parent pid d n getpid exit 0 第二個子程式退出 if waitpid pid,n...
為何要fork 兩次來避免產生殭屍程序?
當我們只fork 一次後,存在父程序和子程序。這時有兩種方法來避免產生殭屍程序 目前先考慮子程序先於父程序結束的情況 由此,可以看出父程序與子程序有父子關係,除非保證父程序先於子程序結束或者保證父程序在子程序結束前執行waitpid 子程序均有機會成為殭屍程序。那麼如何使父程序更方便地建立不會成為殭...