去年我做了一個專案,(重新創建一個像 tcsh 這樣的小終端)我使用了,fork()因為它execve()殺死了實際的行程,所以我用它在子行程fork()中執行execve(),父行程等待它的死。
這里一切都清楚了,現在我正在使用 C 中的套接字,該專案要求我使用select()fd 的處理和fork()治療。所以,我有我的無限回圈select()和fork()里面,我知道我們必須使用fork()更好的性能和速度。但是我看到如果我在父行程中不使用waitpid()或類似,孩子就會變成僵尸。
問題是,有沒有什么辦法可以不用等孩子呢?在父行程執行其他任務時掃描子行程的最佳方法是什么?我的意思是,如果在這種情況下我必須等待孩子,我不會提高速度。
還有一個問題,變成僵尸的孩子會消耗資源嗎?有僵尸孩子有問題嗎?
uj5u.com熱心網友回復:
fork()產生一個子行程;它不是網路編程所必需的,但一些網路程式這樣做是為了允許處理特定客戶端的代碼與接受傳入 TCP 連接的代碼(在父行程中)并行執行。其他方法包括生成執行緒來處理客戶端,或使用異步 I/O,或使用select()非阻塞 I/O 在同一/單個執行緒中處理客戶端。
如果您呼叫fork()并且不希望您的子行程成為僵尸,您將需要waitpid()在某個時候呼叫子行程;否則子行程的回傳值將保持未被收集,您將擁有一個僵尸。但是,您不必waitpid()馬上打電話;如果你傳入WNOHANG引數,你可以避免waitpid()阻塞;相反,如果子行程還活著, withWNOHANG waitpid()將0立即回傳,您可以稍后再嘗試呼叫它。
擁有僵尸行程是一個問題,因為如果您繼續生成它們,最終行程表將充滿僵尸,然后您將無法產生更多行程。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/462586.html
下一篇:如何在localStorage上存盤套接字/在vanillaReactJS上的不同組件上使用套接字以在不同組件socket.io中使用?
