以TCPServ 服務程式來說: 1)父進程:負責系統初始化,以及監聽(listen),接受連接請求(accept);其中accept 預設阻塞調用。 2)每接受一個連接請求,動態新建(fork)一個子進程,任務完成或客戶端斷開,服務子進程需要退 出並收回系統資源。 3)根據linux的設計子進程的 ...
以TCPServ 服務程式來說:
1)父進程:負責系統初始化,以及監聽(listen),接受連接請求(accept);其中accept 預設阻塞調用。
2)每接受一個連接請求,動態新建(fork)一個子進程,任務完成或客戶端斷開,服務子進程需要退
出並收回系統資源。
3)根據linux的設計子進程的收回需要父進程參與(wait調用),而此時附進程主要服務工作在監聽
客戶端連接請求,同時阻塞在(accept)調用,所以父進程自身是無法"分身"去做子進程回收調用。
4)現在的問題在於如何找到父進程的一個服務入口來完成進程回收調用。
方法有2:
1)利用信號機制,由操作系統產生軟中斷進入進程信號服務程式,執行子進程的回收調用。
在附進程(signal/sigaction)註冊SIGCHILD信號,在信號處理函數中執行waitpid調用。
疑問:信號機制可靠嗎?特別是應對大頻率高負載的動態請求響應場景。
2)在父進程中啟動一個新的獨立線程pthread,專門負責執行回收調用,此時使用wait阻塞
調用比較合適,如果使用waitpid需要不停的迴圈等待。註意沒有子進程時wait調用立即
返回失敗。(父進程在fork子進程時候,可以做一個登記).
5)在很多情況下可以考慮用多線程併發代替多進程併發,省去了很多問題。