I O多路轉接(二) poll函式

2021-08-04 14:51:25 字數 1668 閱讀 1015

第二篇介紹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函式不能實現...