I/O多路转接之poll,epoll
1、poll
函數(shù)原型:
#include <poll.h>
int poll(struct pollfd fds[], nfds_t nfds, int timeout);
參數(shù)說明:
fds:是一個struct pollfd結構類型的數(shù)組,用于存放需要檢測其狀態(tài)的Socket描述符;每當調(diào)用這個函數(shù)之后,系統(tǒng)不會清空這個數(shù)組,操作起來比較方便;特別是對于socket連接比較多的情況下,在一定程度上可以提高處理的效率;這一點與select()函數(shù)不同,調(diào)用select()函數(shù)之后,select()函數(shù)會清空它所檢測的socket描述符集合,導致每次調(diào)用select()之前都必須把socket描述符重新加入到待檢測的集合中;因此,select()函數(shù)適合于只檢測一個socket描述符的情況,而poll()函數(shù)適合于大量socket描述符的情況;
nfds:nfds_t類型的參數(shù),用于標記數(shù)組fds中的結構體元素的總數(shù)量;
timeout:是poll函數(shù)調(diào)用阻塞的時間,單位:毫秒;
如果timeout==0,那么poll() 函數(shù)立即返回而不阻塞,如果timeout==INFTIM(宏 表示為-1),那么poll() 函數(shù)會一直阻塞下去,直到所檢測的socket描述符上的感興趣的事件發(fā)生是才返回
函數(shù)返回值:
? ? poll函數(shù)的返回值與select函數(shù)的返回值一樣。
? ? 若返回0:表示超時
? ? 若為-1:錯誤
? ? 若>0:返回就緒事件的個數(shù)
使用poll檢測輸入輸出:
#include?<stdio.h> #include?<poll.h>int?main() {struct?pollfd?pfd[1];int?len?=?1;pfd[0].fd?=?0;pfd[0].events?=?POLLIN;pfd[0].revents?=?0;int?done?=?0;while(!done){switch(poll(pfd,1,-1)){case?0:printf("timeout");break;case?-1:perror("select");break;default:{char?buf[1024];if(pfd[0].revents?&?POLLIN){ssize_t?_s?=?read(pfd[0].fd,buf,sizeof(buf)-1);if(_s?>?0){buf[_s]?=?'\0';printf("echo:%s\n",buf);}}}break;}} }poll函數(shù)的缺點:
(1)大量的fd的數(shù)組被整體復制于用戶態(tài)和內(nèi)核地址空間之間,而不管這樣的復制是不是有意義。
(2)與select一樣,poll返回后,需要輪詢poolfd來獲取就緒的描述符。
poll函數(shù)的優(yōu)點:
(1)poll函數(shù)不要求計算最大文件描述符的大小
(2)poll函數(shù)在應付大數(shù)目的文件描述符的時候速度更快,相比于select
(3)它沒有最大連接數(shù)的限制,原因是它基于鏈表來存儲的。
2. epoll
? ?epoll只有epoll_create,epoll_ctl,epoll_wait3個系統(tǒng)調(diào)用。
?(1)int epoll_create(int size)
? 創(chuàng)建一個epoll的句柄。size參數(shù)是可以被忽略的。當創(chuàng)建好epoll句柄后,它就會占用一個fd值。所以在使用完epoll后,必須調(diào)用close()關閉,否則可能導致fd被耗盡。
?(2)int epoll_ctl(int epfd,int op,int fd,struct epoll_event* event)
??該函數(shù)用于控制某個文件描述符上的事件,可以注冊事件,修改事件,刪除事件。
參數(shù):
?? epfd:由 epoll_create 生成的epoll專用的文件描述符;
?? op:要進行的操作,可能的取值EPOLL_CTL_ADD 注冊、EPOLL_CTL_MOD 修改、?? EPOLL_CTL_DEL 刪除;
?? fd:關聯(lián)的文件描述符;
?? event:告訴內(nèi)核需要監(jiān)聽的事件;
?? 如果調(diào)用成功則返回0,不成功則返回-1。
?(3)int epoll_wait(int epfd,struct epoll_event* events,int maxevents,int timeout)
? ?參數(shù):
?? epfd:由epoll_create 生成的epoll專用的文件描述符;
?? epoll_event:用于回傳代處理事件的數(shù)組;
?? maxevents:每次能處理的事件數(shù);
?? timeout:等待I/O事件發(fā)生的超時值;
測試結果:
epoll的優(yōu)點:
(1)支持一個進程打開大數(shù)目的socket描述符
(2)IO效率不隨socket描述符數(shù)目的增加而線性下降
轉(zhuǎn)載于:https://blog.51cto.com/10810429/1836707
總結
以上是生活随笔為你收集整理的I/O多路转接之poll,epoll的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么做的事情好像梦到过
- 下一篇: Sqli-labs less 64