Linux的三種I O復用方式 poll

2021-09-19 15:01:51 字數 1317 閱讀 5441

select

poll

epollpoll的原型是

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

ndfs:傳入的結構體陣列長度,因為此時的*fds會退化為指標,更準確的來說,ndfs的型別是ndfs_t是無型別的long int資料

timeout:等同於select中timeout的效果

由於pollfd的特性,我麼能關注的事件型別就更多了,如下圖(來自linux高效能伺服器程式設計)

使用前,在檔案一開始加入#define _gnu_source保證pollrdhup正常使用,上圖中pollrdnorm,pollrdband,pollwrnorm,pollwrbandlinux並不是完全支援,這實際上是pollin和pollout更加細化的事件

其中pollin和pollrdhup事件有一定的關聯,如果pollrdhup事件觸發,則pollin也會被觸發,但是反過來不一定。在處理響應事件時要注意判斷到底是pollin還是pollrdhup。

也就是說pollrdhup巢狀在pollin事件裡,先判斷範圍大的然後判斷範圍小的,逐步細分。

#define _gnu_source

#include #include #include #include #include #include #include #include #include #include #include #define fdmaxnum 100

void init_fds(struct pollfd *fds)

{ int i = 0;

for (; i poll的特點:

將使用者關注的事件與核心修改的就緒事件分隔開,每次呼叫poll不需要重新設定

poll通過int型別記錄檔案描述符,檔案描述符的取值範圍擴大到系統最大限制65535

使用者關注的所有檔案描述符通過fds指向的使用者陣列來記錄,則可以關注的檔案描述符的個數由使用者指定,能擴大到系統最大限制

poll存在的問題:

返回值返回就緒的檔案描述符個數,poll也僅僅是在fds指向的陣列元素中標記出那個檔案描述符就緒,使用者探測的時候依然需要for迴圈,時間複雜度依舊是o(n)

在核心中依舊是輪詢方式處理

Linux的三種I O復用方式 select

select poll epollselect的原型是 int select int maxfd,fd set readfds,fd set,fd set writefds,fd set exceptfds,struct timeval timeout maxfd 監聽的最大檔案描述符的值 1 輪詢...

IO復用的三種模型

阻塞式i o 所有套接字預設 非阻塞i o i o復用 select,poll,epoll 訊號驅動式 sigio 核心在描述符就緒時傳送sigio通知程序 非同步i o posix的aio 系列函式 不會阻塞。核心完成後整個操作,通知程序。同步i o 真正的io操作程序會阻塞,直到i o程式結束 ...

三種I O多路復用機制學習記錄 select 2

現在開始學習三種i o多路復用機制的第二種 select,上篇文章也講到,由於我水過了作業系統的上機,因此要不停的補坑,在校的各位未來程式設計師們,上課要好好學習,一定要自己敲。select我真的有點不記得了,但是學過go語言的通道後,一定也會知道go語言中也有乙個select,這兩個select功...