[網絡通訊]使用fork的TCP通訊服務端重起bind問題

現象:服務器

socket服務器,對每一個鏈接fork一個子進程進行處理,此時服務器重起,雖然設置了SO_REUSEADDR,可是仍然bind失敗。ssh

緣由分析:socket

一、fork後,用於LISTEN的socket,也會被子進程繼承,狀態也是處於LISTEN狀態。因此服務重起後bind失敗。繼承

二、能夠在子進程中主動將LISTEN的socket關閉。(由於fork後並無調用exec,因此設置的FD_CLOEXEC並不會起做用。)進程

三、例如,sshd服務就能夠在服務的子進程工做時,重起sshd仍然會成功。 使有strace -f -p pid 跟蹤了一下, 子進程中有close LISTEN socket的操做。bind

相關文章
相關標籤/搜索