I O多路復用 poll

2021-08-21 12:27:43 字數 2656 閱讀 6318

函式結構

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使用三個點陣圖來...