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以上,現在終於了然。