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 poll(struct pollfd *fds, nfds_t nfds, int timeout);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;}
引數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是非面向連線的,沒有乙個客戶端可以老是佔住服務端.只要處理過程不是死迴圈,伺服器對於...