I/O複用函數select,poll,epoll到底啥區別?

select函數只能輪詢linux操作系統提供的fd_set這個類型的變量,這個類型是個數組,且長度是FD_SETSIZE,這個值是1024,是個定值。因此select只能監聽1024個文件描述符是對的,但是並不是只能打開1024個文件(socket也是文件),進程能打開的文件是受另一個變量控制,這個變量是進程能打開的最大文件描述符(用ulimit -n可以查看),而這個變量和FD_SETSIZE不是一個東西,只是這個東西的默認值恰好也是1024。

poll函數輪詢的是pollfd這個類型的數組,這個數組可以自己定義長度,而不是上面select函數只能輪詢定長爲FD_SETSIZE的fd_set變量。它輪詢的仍是數組,而不是鏈表,雖然能監聽的文件數不受FD_SETSIZE限制,但是仍然收到進程可打開的最大文件描述符限制。

epoll不再是輪詢,而是給每個文件描述符上發生的io事件設置一個回調函數。它能監聽的文件數不受FD_SETSIZE限制,但是仍然收到進程可打開的最大文件描述符限制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章