兩次fork()的作用
首先,要了解什麼叫殭屍程序,什麼叫孤兒程序,以及伺服器程序執行所需要的一些條件。兩次fork()就是為了解決這些相關的問題而出現的一種程式設計方法。
孤兒程序
孤兒程序是指父程序在子程序結束之前死亡(return 或exit)。如下圖1所示:
在一定時間內,當系統發現孤兒程序時,init程序就收養孤兒程序,成為它的父親,child程序exit後的資源**就都由init程序來完成。
殭屍程序
殭屍程序是指子程序在父程序之前結束了,但是父程序沒有用wait或waitpid**子程序。
父程序沒有用wait**子程序並不說明它不會**子程序。子程序在結束的時候會給其父程序傳送乙個sigchild訊號,父程序預設是忽略sigchild訊號的,如果父程序通過signal()函式設定了sigchild的訊號處理函式,則在訊號處理函式中可以**子程序的資源。
事實上,即便是父程序沒有設定sigchild的訊號處理函式,也沒有關係,因為在父程序結束之前,子程序可以一直保持殭屍狀態,當父程序結束後,init程序就會負責**殭屍子程序。
但是,如果父程序是乙個伺服器程序,一直迴圈著不退出,那子程序就會一直保持著殭屍狀態。雖然殭屍程序不會占用任何記憶體資源,但是過多的殭屍程序總還是會影響系統效能的。黔驢技窮的情況下,該怎麼辦呢?
這個時候就需要乙個英雄來拯救整個世界,它就是兩次fork()技法。
兩次fork()技法
為了避免子程序child成為殭屍程序,我們可以人為地建立乙個子程序child1,再讓child1成為工作子程序child2的父程序,child2出生後child1退出,這個時候child2相當於是child1產生的孤兒程序,這個孤兒程序由系統程序init**。這樣,當child2退出的時候,init就會**child2的資源,child2就不會成為孤魂野鬼禍國殃民了。
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 */
err_sys("waitpid error");
/* we're the parent (the original process); we continue executing,
knowing that we're not the parent of the second child. */
exit(0);
}理所當然,第二個子程序的父程序是程序號為1的init程序。
一言以蔽之,兩次fork()是人為地建立乙個工作子程序的父程序,然後讓這個人為父程序退出,之後工作子程序就由init**,避免了工作子程序成為殭屍程序。
關於兩次fork
兩次fork 的作用 首先,要了解什麼叫殭屍程序,什麼叫孤兒程序,以及伺服器程序執行所需要的一些條件。兩次fork 就是為了解決這些相關的問題而出現的一種程式設計方法。孤兒程序 孤兒程序是指父程序在子程序結束之前死亡 return 或exit 如下圖1所示 在一定時間內,當系統發現孤兒程序時,ini...
關於兩次fork
我覺得這裡還有些重要的東西沒講,比如setsid 參見apne 8 11.兩次fork 的作用 首先,要了解什麼叫殭屍程序,什麼叫孤兒程序,以及伺服器程序執行所需要的一些條件。兩次fork 就是為了解決這些相關的問題而出現的一種程式設計方法。孤兒程序 孤兒程序是指父程序在子程序結束之前死亡 retu...
fork()函式兩次返回
為什麼fork會返回兩次?由於在複製時複製了 父程序的 堆疊段,所以兩個程序都停留在fork函式中,等待返回。因此fork函式會返回兩次,一次是在父程序中返回,另一次是在子程序中返回,這兩次的返回值是不一樣的。過程如下圖。fork呼叫的乙個奇妙之處就是它僅僅被呼叫一次,卻能夠返回兩次,它可能有三種不...