現象:服務器
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