1024限定的不只是監聽的個數,還是檔案描述符的最大值,注意,是值
今天編寫模擬客戶端程式進行測試,使用了select。之前一直錯記成1024是對fd_set裡fd個數的限制(我的程式是每次select一個fd,所以自我感覺沒問題),結果在socket連線個數到達1050~1100時,總髮生段錯誤。
檢視了core檔案,反覆理清程式的思路,都找不到問題點。更讓我費解的是,通過註釋部分程式碼(都是區域性變數相關的),結果程式變成socket連線到達1500左右時發生段錯誤。
後來想到試試是不是select有問題,模擬程式不呼叫select,全部採用阻塞的socket,結果測試到10000個socket連線都沒有問題。
最後在網上看到select中限定的fd的值最大值是FD_SETSIZE(我的環境下是1024),而不是個數。
也有人持反對意見,比如對值為1025的fd進行select也沒問題。對此我沒有測試,但結合我的實際情況是,對超過1024的fd進行select,問題不能立刻暴露(我都一直到1500了),但可能會存在
類似越界訪問之類的問題(segment fault)。
之前還一直想不通,一直以為是類似ulimit的限制沒有修改。但矛盾的是相同的配置,用poll/epoll寫的服務端卻可以測試到10K以上,現在終於瞭然。