第二篇介紹poll函式,不說廢話直接來看函式。
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
返回值
大於0,準備就緒的file descriptor數量;等於0,超時;小於0,出錯。
引數
fds:
struct pollfd ;
nfds:關心的fd數量
timeout:等待時間單位毫秒 -1,永久等待;0,不等待直接檢測返回;>0,等待時間
poll的特點
與select不同,將輸入與輸出分開不需要每次呼叫前重新設定。
與select相同, 每次都要將fd_array集合由使用者態向核心態拷貝,在核心態要遍歷fd_array,fd數量增多效能下降損失很大。
解決了select有上限的問題,大小可至作業系統允許的最大,使cat/proc/sys/fs/file-max可以檢視。
使用poll函式的網路伺服器
server.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int startup(char*ip,int port)
struct sockaddr_in local;
local.sin_family = af_inet;
local.sin_port = htons(port);
local.sin_addr.s_addr = inet_addr(ip);
if(bind(sock,(struct sockaddr*)&local,sizeof(local)) < 0)
if(listen(sock,10) < 0)
return sock;
}int main(int argc,char *argv)
int listen_sock = startup(argv[1],atoi(argv[2]));
printf("listen_sock has been created,the value is %d\n",listen_sock);
//監聽套接字建立完成,等待讀事件發生。
struct pollfd fd_array[1024];
int i = 0;
int size = 1024;
for(;i//初始化陣列。
fd_array[i].fd = -1;
}//陣列第乙個位置永遠儲存監聽套接字描述符。
fd_array[0].fd = listen_sock;
fd_array[0].events = pollin;
while(1)else
}if(i==size)
}}else
if(i!= 0&&fd_array[i].revents&pollin)else
if(s==0)else}}
}break; }}
return
0;}
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常...
多路IO轉接伺服器實現方法二 poll 函式
相較於多路io轉接伺服器實現方法一 select 函式,使用poll 函式的優點有 檔案描述符的上限可以突破1024 select 函式監聽集合與返回的滿足監聽條件的集合為乙個集合,而poll函式將監聽集合與符合監聽條件的集合實現了分離 搜尋滿足條件的檔案描述符的範圍縮小了 但,poll函式不能實現...