Linux下的i o復用 poll

2021-10-23 12:52:14 字數 2247 閱讀 1997

1、i/o復用

乙個程序或者乙個執行緒能夠同時對多個檔案描述符(socket)提供服務,伺服器上的程序或執行緒如何將多個檔案描述符統一監聽,當任意乙個檔案描述符上有事件發生,其都能及時處理。

2、poll()函式

函式原型:int poll(struct pollfd *fds,int nfds,int timeout);

函式原型引數解釋:

struct pollfd的定義

struct pollfd

;nfds:陣列的長度 、元素的個數 、使用者關注的檔案描述符個數,

timeout:超時時間。

函式返回值:

(1)返回值小於0,表示出錯

(2)返回值等於0,表示poll函式等待超時

(3)返回值大於0,表示poll由於監聽的檔案描述符就緒返回,並且返回結果就是就緒的檔案描述符的個數。

關注的事件 events

pollin 有資料可讀

pollrdnorm 有普通資料可讀

pollrdband 有優先資料可讀

pollpri 有緊急資料可讀

pollout 資料可寫

pollwrnorm 普通資料可寫

pollwrband 優先資料可寫

pollmsgsigpoll 訊息可用

返回事件 revent

除了 事件外;還有

pollerr 指定描述符發生錯誤

pollhup 指定檔案描述符掛起事件

pollnval 指定描述符非法

3、poll()比select()的優勢

4、簡單的實現使用poll來進行通訊(**)

1、服務端來連線接收資料的**:

#define _gnu_source

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define size 100

void

init_fds

(struct pollfd *fds)

}void

insert_fds

(struct pollfd *fds,

int fd,

short event)}}

void

delete_fds

(struct pollfd *fds,

int fd)}}

intmain()

int i=0;

for(

;i++i)

else

if(fds[i]

.events & pollin)

insert_fds

(fds,c,pollin | pollrdhup);}

else

;recv

(fd,buff,

127,0)

;printf

("%d: %s\n"

,fd,buff)

;send

(fd,

"ok",2

,0);

}}}}

}}

客戶端來連線傳送資料的**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

intmain()

;printf

("input:\n");

fgets

(buff,

128,

stdin);

if(strncmp

(buff,

"end",3

)==0)

send

(sockfd,buff,

strlen

(buff),0

);memset

(buff,0,

128)

;recv

(sockfd,buff,

127,0)

;printf

("buff=%s\n"

,buff);}

close

(sockfd)

;}

IO復用 poll函式

poll提供的功能與select函式類似,不過在處理流裝置時,它能夠提供額外的資訊 include int poll struct pollfd fdarray,unsigned long nfds,int timeout 返回 若有就緒的描述符則為其數目,若超時則為0,若出錯則為 1 第乙個引數是...

IO復用 poll函式

東陽的學習筆記 poll提供的功能和 select 類似,不過在處理流裝置時,它能提供額外的資訊。include intpoll struct pollfd fdarray,unsigned long nfds,int timeout 第乙個引數時指向乙個結構陣列第乙個元素的指標。每個陣列元素都是乙...

I O多路復用 poll

函式結構 int poll struct pollfd fds,nfds t nfds,int timeout 引數 返回值 和select一模一樣 events和revents events 關注事件 讀就緒 寫就緒 異常 輸入的時候起作用 revents 輸出結果,輸出的時候起作用 輸入輸出引數...