多路復用IO select poll

2021-08-01 22:31:46 字數 2327 閱讀 8893

linux提供了兩個函式來實現多路復用io操作

int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);

void fd_clr(int fd, fd_set *set);

int fd_isset(int fd, fd_set *set);

void fd_set(int fd, fd_set *set);

void fd_zero(fd_set *set);

引數ndfs:select中監視的檔案控制代碼數,一般設為要監視的檔案中的最大fd+1。

引數readfds:需要讀取的fd_set型別的結構體位址

引數writefds: 需要寫入的fd_set型別的結構體位址

引數exceptfds:

引數timeout:select()的超時結束時間。

這個引數它使select處於三種狀態,

第一,若將null以形參傳入,即不傳入時間結構,就是將select置於阻塞狀態,

一定等到監視檔案描述符集合中某個檔案描述符發生變化為止;

第二,若將時間值設為0秒0毫秒,就變成乙個純粹的非阻塞函式,不管檔案描述符是否有變化,

都立刻返回繼續執行,檔案無變化返回0,有變化返回乙個正值;

第三,timeout的值大於0,這就是等待的超時時間,即select在timeout時間內阻塞,

超時時間之內有事件到來就返回了,否則在超時後不管怎樣一定返回,返回值同上述。

返回值:

負值:select錯誤

0:等待超時,沒有可讀寫或錯誤的檔案

正值:某些檔案可讀可寫或出錯

int main(int argc,char **argv)

; fd_set myreadfds;

struct timeval mytimeout;

fd = open(mouse,o_rdonly );/*滑鼠阻塞*/

if(fd<0)

/*fd -> mouse, 0->keyboard*/

fd_zero(&myreadfds);/*清空內容*/

fd_set(fd,&myreadfds);/*新增fd*/

fd_set(0,&myreadfds);/*新增fd*/

mytimeout.tv_sec = 3;/*設定超時時間*/

mytimeout.tv_usec = 0;

ret = select(fd+1,&myreadfds,null,null,&mytimeout);

if(ret<0)

else

if(ret == 0)

printf("time out.\r\n");

else

else

if(fd_isset(fd,&myreadfds))/*mouse*/

}close(fd);

return

0;}

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

引數fds為需要操作的struct pollfd 型別的結構體的位址

引數ndfs:select中監視的檔案控制代碼數,一般設為要監視的檔案中的最大fd+1。

引數timeout為最大超時時間(單位ms)

負值:poll錯誤

0:等待超時,沒有可讀寫或錯誤的檔案

正值:成功

int main(int argc,char **argv)

; struct pollfd myfds[2] = ;

fd = open(mouse,o_rdonly );/*滑鼠阻塞*/

if(fd<0)

myfds[0].fd = 0;/*keyboard*/

myfds[0].events = pollin;/*輸入方式*/

myfds[1].fd = fd;/*mouse*/

myfds[1].events = pollin;/*輸入方式*/

ret = poll(myfds,fd+1,3000);/*超時3s*/

if(ret<0)

else

if(ret == 0)

printf("time out.\r\n");

else

else

if(myfds[1].events == myfds[1].revents)//mouse

}close(fd);

return

0;}

Linux IO多路復用

一.select 函式 include include include int select int n,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout fd clr int fd,fd set set f...

I O多路復用

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

Linux C Socket多路復用

1.迴圈伺服器 udp伺服器 udp迴圈伺服器的實現非常簡單 udp伺服器每次從套接字上讀取乙個客戶端的請求,處理,然後將結果返回給客戶機.可以用下面的演算法來實現.socket bind while 1 因為udp是非面向連線的,沒有乙個客戶端可以老是佔住服務端.只要處理過程不是死迴圈,伺服器對於...