1、i/o復用
乙個程序或者乙個執行緒能夠同時對多個檔案描述符(socket)提供服務,伺服器上的程序或執行緒如何將多個檔案描述符統一監聽,當任意乙個檔案描述符上有事件發生,其都能及時處理。
2、poll()函式
函式原型:int poll(struct pollfd *fds,int nfds,int timeout);
函式原型引數解釋:
struct pollfd的定義
struct pollfd
;nfds:陣列的長度 、元素的個數 、使用者關注的檔案描述符個數,
timeout:超時時間。
函式返回值:
(1)返回值小於0,表示出錯
(2)返回值等於0,表示poll函式等待超時
(3)返回值大於0,表示poll由於監聽的檔案描述符就緒返回,並且返回結果就是就緒的檔案描述符的個數。
關注的事件 events
pollin 有資料可讀
pollrdnorm 有普通資料可讀
pollrdband 有優先資料可讀
pollpri 有緊急資料可讀
pollout 資料可寫
pollwrnorm 普通資料可寫
pollwrband 優先資料可寫
pollmsgsigpoll 訊息可用
返回事件 revent
除了 事件外;還有
pollerr 指定描述符發生錯誤
pollhup 指定檔案描述符掛起事件
pollnval 指定描述符非法
3、poll()比select()的優勢
4、簡單的實現使用poll來進行通訊(**)
1、服務端來連線接收資料的**:
#define _gnu_source
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define size 100
void
init_fds
(struct pollfd *fds)
}void
insert_fds
(struct pollfd *fds,
int fd,
short event)}}
void
delete_fds
(struct pollfd *fds,
int fd)}}
intmain()
int i=0;
for(
;i++i)
else
if(fds[i]
.events & pollin)
insert_fds
(fds,c,pollin | pollrdhup);}
else
;recv
(fd,buff,
127,0)
;printf
("%d: %s\n"
,fd,buff)
;send
(fd,
"ok",2
,0);
}}}}
}}
客戶端來連線傳送資料的**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
intmain()
;printf
("input:\n");
fgets
(buff,
128,
stdin);
if(strncmp
(buff,
"end",3
)==0)
send
(sockfd,buff,
strlen
(buff),0
);memset
(buff,0,
128)
;recv
(sockfd,buff,
127,0)
;printf
("buff=%s\n"
,buff);}
close
(sockfd)
;}
IO復用 poll函式
poll提供的功能與select函式類似,不過在處理流裝置時,它能夠提供額外的資訊 include int poll struct pollfd fdarray,unsigned long nfds,int timeout 返回 若有就緒的描述符則為其數目,若超時則為0,若出錯則為 1 第乙個引數是...
IO復用 poll函式
東陽的學習筆記 poll提供的功能和 select 類似,不過在處理流裝置時,它能提供額外的資訊。include intpoll struct pollfd fdarray,unsigned long nfds,int timeout 第乙個引數時指向乙個結構陣列第乙個元素的指標。每個陣列元素都是乙...
I O多路復用 poll
函式結構 int poll struct pollfd fds,nfds t nfds,int timeout 引數 返回值 和select一模一樣 events和revents events 關注事件 讀就緒 寫就緒 異常 輸入的時候起作用 revents 輸出結果,輸出的時候起作用 輸入輸出引數...