IO的多路復用

2021-08-21 09:25:12 字數 1333 閱讀 6702



使用select函式實現io多路復用

#include

#include

#include

#include

1、select()

int select(int nfds, fd_set *readfds, fd_set *writefds,

fd_set *exceptfds, struct timeval *timeout);

nfds:最大的檔案描述符加1

readfds:讀檔案描述符集合

writefds:寫檔案描述符集合

exceptfds:其他或者異常的

timeout:超時檢測

null  阻塞         成功:準備就緒的檔案描述符的個數   失敗:-1

void fd_zero(fd_set *set);

清空乙個集合set

void fd_set(int fd, fd_set *set);

將檔案描述符fd新增到集合set裡面

void fd_clr(int fd, fd_set *set);

將檔案描述符fd從集合set裡面移除

int  fd_isset(int fd, fd_set *set);

判斷檔案描述符fd是否在集合裡面

0  不存在

1  存在

3、實現的步驟舉例;

第一步:

建立乙個集合並清空集合

fd_set readfds(這是乙個定義好的檔案描述符列表的結構體)

int maxfd

fd_zero(&readfds);

maxfd = sockfd;

第二步:將需要執行io操作的檔案描述符新增到集合裡面       ( 用while(1)迴圈包含第二步到第四步,可多次實現復用)

fd_set(0, &readfds);

fd_set(sockfd, &readfds);

第三步:呼叫函式,阻塞等待檔案描述符準備就緒

(注:當select函式返回之後,會從集合裡面移除除當前準備就緒的檔案描述符以外其他所有的)

select(maxfd + 1, &readfds, null, null, null)

第四步:判斷當前集合裡面還有哪個檔案描述符,則直接執行相應操作即可

if(fd_isset(0, &readfds) == 1)

if(fd_isset(sockfd, &readfds) == 1)

printf("%s -- %d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

}

I O多路復用

一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...

i o多路復用

最常見的i o多路復用就是 select poll epoll了,下面說說他們的一些特點和區別吧。select 可讀 可寫 異常三種檔案描述符集的申明和初始化。fd set readfds,writefds,exceptionfds fd zero readfds fd zero writefds ...

I O多路復用

我們都知道unix like 世界裡,一切皆檔案,而檔案是什麼呢?檔案就是一串二進位製流而已,不管socket,還是fifo 管道 終端,對我們來說,一切都是檔案,一切都是流。在資訊 交換的過程中,我們都是對這些流進行資料的收發操作,簡稱為i o操作 input and output 往流中讀出資料...