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