函式結構
int poll(struct pollfd* fds,nfds_t nfds,int timeout);
引數:
返回值: 和select一模一樣
events和revents
events: 關注事件(讀就緒/寫就緒/異常),輸入的時候起作用
revents: 輸出結果,輸出的時候起作用
輸入輸出引數分離,並且每次呼叫的時候不需要重新設定
取值:(部分)
事件描述
是否可作為輸入
是否可作為輸出
pollin
資料(包括普通資料和優先資料)可讀是是
pollout
資料(包括普通資料和優先資料)可寫是是
pollrdnorm
普通資料可讀是是
pollrdband
優先順序帶資料可讀(linux不支援)是是
pollpri
高優先順序資料可讀,比如tcp帶外資料是是
poll優點
poll缺點
**1.用poll監視標準輸入
#include #include #include int main()
if(ret == 0)
if(fds.revents == pollin)
;read(0,buf,sizeof(buf)-1);
printf("stdin: %s\n",buf);}}
return 0;
}
結果演示:
**2.多路轉接伺服器
// poll_server.c
#include #include #include #include #include #include #include #include typedef struct pollfd pollfd;
int serverstart(short port)
struct sockaddr_in addr;
addr.sin_family = af_inet;
addr.sin_addr.s_addr = htonl(inaddr_any);
addr.sin_port = htons(port);
if(bind(fd,(struct sockaddr*)&addr,sizeof(addr)) < 0)
if(listen(fd,5) < 0)
return fd;
}void init(pollfd* fd_list,int size)
}void add(int fd,pollfd* fd_list,int size)
}}int main(int argc, char* argv)
int listen_sock = serverstart(atoi(argv[1]));
if(listen_sock < 0)
pollfd fd_list[1024];
init(fd_list,sizeof(fd_list)/sizeof(pollfd));
add(listen_sock,fd_list,sizeof(fd_list)/sizeof(pollfd));
// 進入事件迴圈
while(1)
else if(ret == 0)
size_t i = 0;
for(; i < sizeof(fd_list)/sizeof(pollfd); ++i)
if(!(fd_list[i].revents & pollin)) //如果輸出引數不是pollin,就跳過
if(fd_list[i].fd == listen_sock)
add(new_sock,fd_list,sizeof(fd_list)/sizeof(pollfd));
printf("[client: %d] connect\n",new_sock);
}else
;ssize_t read_size = read(fd_list[i].fd,buf,sizeof(buf)-1);
if(read_size < 0)
if(read_size == 0)
printf("[client: %d] : %s\n",fd_list[i].fd,buf);
write(fd_list[i].fd,buf,strlen(buf)); // 回顯
} // end else
} // end for(; i < sizeof(fd_list)/sizeof(pollfd); ++i)
} // end while(1)
return 0;
}
客戶端**和select客戶端**一致,這裡就不寫了,需要的朋友可以移步☞ i/o多路復用 - selec poll實現I O多路復用
poll函式原型 引數說明 fds 是乙個struct pollfd結構型別的陣列,用於存放需要檢測其狀態的socket描述符 每當呼叫這個函式之後,系統不會清空這個陣列,操作起來比較方便 特別是對於socket連線比較多的情況下,在一定程度上可以提高處理的效率 這一點與select 函式不同,呼叫...
I O多路復用之poll
poll的優點 1 poll 不要求開發者計算最大檔案描述符加一的大小。2 poll 在應付大數目的檔案描述符的時候速度更快,相比於select。3 它沒有最大連線數的限制,原因是它是基於鍊錶來儲存的。poll的缺點 1 大量的fd的陣列被整體複製於使用者態和核心位址空間之間,而不管這樣的複製是不是...
IO多路復用之poll
poll和select區別 poll伺服器監視的檔案描述符無上限 poll將輸入 輸出引數進行分離。一 poll函式 函式格式如下所示 include int poll struct pollfd fds,unsigned int nfds,int timeout 不同與select使用三個點陣圖來...