I O復用之poll的實現

2021-09-19 12:31:59 字數 1813 閱讀 1279

poll系統呼叫和select類似,也是在指定時間內輪詢一定數量的檔案描述符,以測試其中是否有就緒者。

poll的原型如下:

int poll(struct pollfd *fd, int nfds, int timeout)

fds:是乙個pollfd結構型別的陣列,它指定所有我們感興趣的檔案描述符上發生的可讀、可寫和異常等事件。pollfd結構體定義如下

struct pollfd

;

poll的事件型別

注意:pollrdhup事件發生也會觸發pollin事件

nfds:引數指定被監聽事件集合的大小(型別為unsigned long int)。

timeout:引數指定poll的超時值,單位毫秒,當timeout為-1時,poll呼叫將永遠阻塞,知道某個事件發生;當timeout為0時,poll呼叫將立即返回。

返回值:成功返回就緒檔案描述符的個數,失敗返回-1,超時時間到達無檔案描述符就緒返回0。

1.將使用者關注的事件與核心修改的就緒事件分隔開,每次呼叫poll不需要重新設定

2.poll通過int型別記錄檔案描述符,檔案描述符的取值範圍擴大到系統最大值65535

3.使用者關注的所有檔案描述符通過fds執行的使用者陣列來記錄,介意關注的檔案描述符的個數由使用者決定,可以擴大到系統最大值。

1.返回值依舊是就緒檔案描述符的個數,仍然需要去探測陣列中檔案描述符,時間複雜度為o(n)

2.核心也是採用輪詢的方式處理

具體實現**如下:

//初始化該使用者陣列,檔案描述符置-1,事件置0

void initfds(struct pollfd *fds)

}

//將獲取到的檔案描述符,新增事件(pollin | pollrdhup)

void addfd(int fd, struct pollfd *fds)

}}

//將斷開鏈結的檔案描述符從使用者陣列刪除,事件置0

void deletefd(int fd, struct pollfd *fds)

}}

//獲取的檔案描述符是新客戶端的連線,接收(accept())新的鏈結,並將該檔案描述符存入使用者陣列中並設定事件

void getclientlink(int fd, struct pollfd *fds)

//獲取的檔案描述符是客戶端的資訊時,處理收到的資訊

void dealclientdata(int fd, struct pollfd *fds)

; int n = recv(fd, buff, 127, 0);

if(n <= 0)

printf("%s\n", buff);

send(fd, "ok", 2, 0);

}

int main()

int i = 0;

//輪詢方式去檢索符合陣列中的檔案描述符是否有對應的事件發生,對不同型別的檔案描述符進行不同處理

for(; i

else if(fds[i].revents & pollin)//若事件是讀則判斷檔案描述符是新客戶端連線還是客戶端資訊

else}}

} }}

I O 復用之 poll 函式

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

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