linux 下select的1024限制

http://www.bubuko.com/infodetail-769475.htmlphp

1024限定的不僅是監聽的個數,仍是文件描述符的

最大值,注意,是值 

今天編寫模擬客戶端程序進行測試,使用了select。以前一直錯記成1024是對fd_set裏fd個數的限制(個人程序是每次select一個fd,因此自我感受沒問題),結果在socket鏈接個數到達1050~1100時,總髮生段錯誤。

查看了core文件,反覆理清程序的思路,都找不到問題點。更讓我費解的是,經過註釋部分代碼(都是局部變量相關的),結果程序變成socket鏈接到達1500左右時發生段錯誤。html

 

後來想到試試是否是select有問題,模擬程序不調用select,所有采用阻塞的socket,結果測試到10000個socket鏈接都沒有問題。app

 

最後在網上看到select中限定的fd的值最大值是FD_SETSIZE(個人環境下是1024),而不是個數。socket

也有人持反對意見,好比對值爲1025的fd進行select也沒問題。對此我沒有測試,但結合個人實際狀況是,對超過1024的fd進行select,問題不能馬上暴露(我都一直到1500了),但可能會存在測試

相似越界訪問之類的問題(segment fault)。ui

 

以前還一直想不通,一直覺得是相似ulimit的限制沒有修改。但矛盾的是相同的配置,用poll/epoll寫的服務端卻能夠測試到10K以上,如今終於瞭然。url

相關文章
相關標籤/搜索