多路轉接模型之poll

2021-07-04 13:12:39 字數 1744 閱讀 6678

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常...