日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

IO多路复用:select/poll/epoll

發(fā)布時(shí)間:2025/3/21 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IO多路复用:select/poll/epoll 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

select

int select (int maxfds,fd_set * readfds,fd_set * writefds,fd_set * errorfds,struct timeval* timeout)

返回值:有變化的描述符,返回值大于零,且為描述符個(gè)數(shù);等于零,超時(shí)或者沒(méi)有變化的描述符;-1出錯(cuò)。

timeout參數(shù)

1)null時(shí),select將會(huì)一直阻塞,直到有監(jiān)聽(tīng)的描述符集合里面描述符發(fā)生了變化;

2)0時(shí),select 會(huì)立即返回,有無(wú)描述符發(fā)生變化都會(huì)立即返回;

3)大于零的值,指定超時(shí)時(shí)間,超出時(shí)間就返回;

?

Poll

int poll (struct pollfd* fds , unsigned int nfds , int timeout)

struct pollfd{

? ? int fd;

? ? short events;

? ? short revents;

}

返回值:大于零,返回revents中不為0的文件描述符個(gè)數(shù);等于零,超時(shí)或者沒(méi)有描述符就緒;-1,調(diào)用出錯(cuò)。

timeout參數(shù):
?

1)負(fù)數(shù),無(wú)限超時(shí);一直等待,直到一個(gè)指定的事件發(fā)生;? ?相當(dāng)于selsect中的NULL;

2)0;表示立即返回;無(wú)論是否有已經(jīng)準(zhǔn)備好的描述符;

3)大于零,指定等待的超時(shí)時(shí)間;超時(shí)后返回

?

?

epoll

創(chuàng)建epoll句柄

int epoll_create (int size);

向內(nèi)核注冊(cè),修改或者刪除 一個(gè)描述符

int epoll_ctl (int epfd, int operator , int fd , struct epoll_events * event?);

等待事件的產(chǎn)生

int epoll_wait (int epfd, struct epoll_events*events , int maxevents , int timeout);

timeout參數(shù):0立即返回,-1將永久阻塞直到有一個(gè)描述符有事件產(chǎn)生;大于零,指定超時(shí)時(shí)間

?


select、poll、epoll的區(qū)別

1)select : 描述符集合有上限,一般是1024/2048;每次需要線性遍歷描述符集合獲得描述符的事件狀態(tài),對(duì)于分布的比較稀疏的比較少的描述符,效率會(huì)很低;每次fd_set在select返回之后都會(huì)發(fā)生變化;需要重新初始化;但移植性比較好,在某些unix系統(tǒng)上不支持poll,超時(shí)時(shí)間精度比較高

2)poll相對(duì)于select而言,描述符數(shù)量遠(yuǎn)遠(yuǎn)大于select,是喲個(gè)特定大小的數(shù)組來(lái)保存監(jiān)控的描述符,從而不受描述符值大小的影響;poll將監(jiān)控的輸入事件和輸出事件分開(kāi),允許在每次返回后,被監(jiān)控的文件數(shù)組可以被復(fù)用而不需要重新初始化;

3)epoll 使用一個(gè)文件描述符管理多個(gè)描述符。支持一個(gè)進(jìn)程打開(kāi)大數(shù)目的描述符,也即是描述符數(shù)量不受限制,對(duì)于支持上萬(wàn)連接的IM服務(wù)器而言,較為實(shí)用!上限是最大可以打開(kāi)的文件數(shù)目;IO效率不隨描述符的數(shù)量的增加而減少。在每個(gè)注冊(cè)到內(nèi)核的fd上實(shí)現(xiàn)了回調(diào)函數(shù),只有當(dāng)當(dāng)前socket活躍的時(shí)候才會(huì)去調(diào)用回調(diào)函數(shù),所以epoll只會(huì)對(duì)活躍的socket進(jìn)行操作(即事件驅(qū)動(dòng))。而select/poll要線性掃描所有的集合,導(dǎo)致效率下降。epoll將用戶關(guān)系的文件描述符的事件存放到內(nèi)核的事件表中,避免了用戶空間和內(nèi)核空間數(shù)據(jù)的多次拷貝

總結(jié)

以上是生活随笔為你收集整理的IO多路复用:select/poll/epoll的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。