IO多路復用 select與epoll

2021-09-28 14:54:04 字數 2100 閱讀 5097

學習:

i/o 多路復用的設計初衷就是解決這樣的場景。我們可以把標準輸入、套接字等都看做 i/o 的一路,多路復用的意思,就是在任何一路 i/o 有「事件」發生的情況下,通知應用程式去處理相應的 i/o 事件,這樣我們的程式就變成了「多面手」,在同一時刻彷彿可以處理多個 i/o 事件。

void fd_zero(fd_set *fdset);      

void fd_set(int fd, fd_set *fdset);  

void fd_clr(int fd, fd_set *fdset);   

int  fd_isset(int fd, fd_set *fdset);

int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);

返回:若有就緒描述符則為其數目,若超時則為 0,若出錯則為 -1。

在這個函式中,maxfd 表示的是待測試的描述符基數,它的值是待測試的最大描述符加 1。比如現在的 select 待測試的描述符集合是,那麼 maxfd 就是 5,描述符為0時,表示標準的輸入輸出。緊接著的是三個描述符集合,分別是讀描述符集合 readset、寫描述符集合 writeset 和異常描述符集合 exceptset,這三個分別通知核心,在哪些描述符上檢測資料可以讀,可以寫和有異常發生。

int main(int argc, char **ar**) 

int socket_fd = tcp_client(ar**[1], serv_port);

char recv_line[maxline], send_line[maxline];

int n;

fd_set readmask;

fd_set allreads;

fd_zero(&allreads);

fd_set(0, &allreads);

fd_set(socket_fd, &allreads);

for (;;)

if (fd_isset(socket_fd, &readmask)) else if (n == 0)

recv_line[n] = 0;

fputs(recv_line, stdout);

fputs("\n", stdout);

}if (fd_isset(stdin_fileno, &readmask))

printf("now sending %s\n", send_line);

size_t rt = write(socket_fd, send_line, strlen(send_line));

if (rt < 0)

printf("send bytes: %zu \n", rt);}}

}}

select所支援的描述符的個數是有限的,linux中,預設最大值為1024。

poll是除了select之外,另一種使用普遍的i/o多路復用技術,突破了檔案描述符的個數限制。

struct pollfd ;

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

fds: pollfd結構體的陣列指標;nfds:fds陣列的長度;timeout:超時設定。

返回值:若有就緒描述符則為其數目,若超時則為 0,若出錯則為 -1。

#define init_size 128

int main(int argc, char **ar**)

for (;;)

if (event_set[0].revents & pollrdnorm)

}if (i == init_size)

if (--ready_number <= 0)

continue;

}for (i = 1; i < init_size; i++)

} else if (n == 0 || errno == econnreset) else

if (--ready_number <= 0)

break;}}

}}

IO多路復用 select

select系統呼叫的目的是 在一段指定時間內,監聽使用者感興趣的檔案描述符上的可讀 可寫和異常事件。poll和select應該被歸類為這樣的系統 呼叫,它們可以阻塞地同時探測一組支援非阻塞的io裝置,直至某乙個裝置觸發了事件或者超過了指定的等待時間 也就是說它們的職責不是做io,而是幫助 呼叫者尋...

IO多路復用 select

出自朱有鵬老師的課堂 include include include include include include include include include int main void 當前有兩個fd,乙個是fd乙個是0 處理 myset fd zero myset 全部清零 fd set ...

I O多路復用 select

int select int n,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout 有三種型別的描述符型別 readset writeset exceptset,分別對應讀 寫 異常條件的描述符集合。fd s...