天天看點

伺服器程序fork()兩次的原因

作為一個伺服器程序,是需要不斷運作的,不能夠 退出的程序,但是如何保證伺服器程序運作過程中不會因為子程序而影響伺服器的性能呢?這裡來闡述伺服器程序父程序建立子程序之後會帶來的一些問題,以及如何解決這些問題。

伺服器程序fork()一次,産生一個子程序,作為工作程序,當這個工作程序運作結束之後,向父程序發送SIGCHILD信号,預設情況下,父程序會忽略這個信号,除非采用signal()信号處理函數對子程序的資源進行回收,否則,此時工作程序就會成為一個僵屍程序,僵屍程序雖然不占用系統的任何資源,但是過多的僵屍程序會影響系統的性能。那麼怎麼才能讓工作程序不成為僵屍程序呢?此時在建立一次fork(),讓第一次建立的子程序成為第二次fork()的父程序,然後建立的子程序作為工作程序,此時讓工作程序的父程序退出,計算機系統中當父程序退出,子程序未退出,此時的子程序成為了孤兒程序,那麼他會被init程序收養,當孤兒程序退出時,會由init程序來回收資源。綜上所述,對于一個一直運作的伺服器程序,要産生工作程序,采用兩次fork()可以避免僵屍程序的産生,能夠保證系統性能。

繼續閱讀