poll系統呼叫和select類似,也是在指定時間內輪詢一定數量的檔案描述符,以測試其中是否有就緒者。poll和select效率差不多,只是其使用介面相對簡單些,poll不在侷限於1024個檔案描述符,poll監聽事件和觸發事件分開,event表示監聽事件,revents表示觸發的事件。相比select不用每一次都需要重新設定監聽事件。
#include int poll(struct pollfd *fds, nfds_t nfds, int timeout);
//第乙個引數是struct pollfd陣列
struct pollfd
;pollin普通或帶外優先資料可讀,即pollrdnorm | pollrdband
pollrdnorm-資料可讀
pollrdband-優先順序帶資料可讀
pollpri 高優先順序可讀資料
pollout普通或帶外資料可寫
pollwrnorm-資料可寫
pollwrband-優先順序帶資料可寫
pollerr 發生錯誤
pollhup 發生掛起
pollnval 描述字不是乙個開啟的檔案
第二個引數,指結構體陣列長度。
timeout 毫秒級等待
-1:阻塞等,#define inftim -1 linux中沒有定義此巨集
0:立即返回,不阻塞程序
>0:等待指定毫秒數,如當前系統時間精度不夠毫秒,向上取值
poll server端例項:
#include#include#include#include #include #include #include #include #include#define open_max 1024
int create_listen(int port)
if(setsockopt(listen_st,sol_socket,so_reuseaddr,&on,sizeof(on))==-1)
s_addr.sin_port=htons(port);
s_addr.sin_family=af_inet;
s_addr.sin_addr.s_addr=htonl(inaddr_any);
if(bind(listen_st,(struct sockaddr*)&s_addr,sizeof(struct sockaddr_in))==-1)
if (listen(listen_st, 5) == -1) // 設定檔案描述符具有監聽的功能
return listen_st;
}int run_server(int port)
for(i=1;imaxi) //記錄最大下標
}if(--nready==0) continue;
} for(i=1;i<=maxi;i++)
if(client[i].revents&pollin)
}else if(rv==0)
else
if (--nready == 0) break; //就緒個數減一}}
} close(listen_st);
return 0;
}int main(int argc,char *argv)
int port=atoi(argv[1]);
if(port==0)
printf("start server \n");
run_server(port);
return 0;
}
Linux I O多路轉接 poll模型
1.poll模型屬於i o多路轉接模型,是對select模型的一種優化 int poll struct pollfd fds,nfd t nfds,int timeout 2.poll的優點 poll使用陣列儲存檔案描述符,所以能描述的檔案描述個數在理論上沒有上限 poll將輸入輸出型引數進行了分離...
I O多路轉接之poll
poll 函式 這個函式是某些linux系統提供的用於執行與select 函式同等功能的函式,下面是這個函式的宣告 include int poll struct pollfd fds,nfds t nfds,int timeout 引數說明 fds 是乙個struct pollfd結構型別的陣列,...
IO多路轉接之poll
poll函式 include int poll struct pollfd fds,nfds t nfds,int timeout pollfd結構 struct pollfd fds poll函式監聽的結構列表 nfds fds陣列的長度。timeout 喚醒時間 pollfd結構體events常...