poll, select與epoll的用法

2021-08-01 05:02:00 字數 2535 閱讀 2063

多路io復用: 就是實現同時監控多個檔案描述符(此類檔案描述符必須為不可操作時會進入堵塞狀態), 會堵塞直到有乙個或多個檔案描述符可操作為止, 通過返回值找出可操作的檔案描術符(可代替多執行緒工作).

linux下共有三個函式可完成此工作:

一. poll函式

#include 

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

每個要被監控的檔案描術符需要乙個struct pollfd結構體變數來描述

struct pollfd ;

/////////

/// fds是struct pollfd結構體的變數陣列

nfds是表示struct pollfd陣列的元素個數

timeout表示poll函式的最大的堵塞時間, 如超時則不管有沒有檔案描述符可操作都會返回.

負數表示堵塞沒有時間限制.

////

此函式返回值為多少個結構體變數的revents成員有值的個數. 0表示超時. -1表示出錯

////沒有辦法通過函式返回值判斷哪個檔案描述符可操作.只能通過結構體變數的revents成員

//也就是只能遍歷整個struct pollfd陣列裡元素的revents成員來找出

二. select函式

#include 

intselect(int nfds, fd_set *readfds, fd_set *writefds,

fd_set *exceptfds, struct timeval *timeout);

readfds, writefds, exceptfds是三個檔案描述符的集合, 分別裝載要監控可讀操作的檔案描述符, 裝監控可寫的檔案描述符, 裝監控發生異常的檔案描述符

nfds是三個檔案描述符裡最大的檔案描述符數 + 1;

timeout指select函式的最大超時上限. 為null表示沒有上限時間

函式返回值為多少個檔案描述符可操作. 為0表示超時, -1出錯

//關於檔案描述符fd_set的操作

void fd_clr(int fd, fd_set *set); //從集合set裡清除fd

int fd_isset(int fd, fd_set *set);//判斷fd是否在集合set裡

void fd_set(int fd, fd_set *set); //把fd加入集合set裡

void fd_zero(fd_set *set); //把集合set清空

//怎樣判斷哪些檔案描述符可操作,沒法通過函式返回值判斷

//函式返回後,在集合裡只會留下可操作的檔案描述符, 只能在集合裡通歷遍判斷找出具體哪些檔案描述符可操作

三. epoll函式

#include 

1. 先建立epoll的例項

int epoll_create(int size); //size為指定能監控的檔案描述符數上限

int epoll_create1(int flags); //不用指定上限, flags設0即可

返回值為乙個檔案描述符,此檔案描述符是引用epoll例項的, 也就是通過此檔案描述符可操作建立出來的epoll例項

2. 通過epoll_ctl函式把要監控的檔案描述符加入epoll例項裡, 也可以通過epoll_ctl函式從epoll例項裡稱除檔案描述符.

int epoll_ctl(int epfd, int op, int fd, struct

epoll_event *event);

// epfd為引用epoll例項的檔案描述符

// op為具體操作:

epoll_ctl_add:把fd加入epoll例項

epoll_ctl_del:把fd從epoll例項移除掉

//每加入乙個檔案描述符到epoll例項裡,都需要呼叫此函式一次.

typedef

union epoll_data epoll_data_t;

struct epoll_event ;

struct myevent ;

struct myevent myevt;

epoll_ctl(...., &myevt.evt)

3. 通過epoll_wait函式等待返回可操作的檔案描述符

int epoll_wait(int epfd, struct epoll_event *events,

int maxevents, int timeout);

//epfd表示引用epoll例項的檔案描述符

//evetns表示接收到可操作檔案描述符對應的epoll_event變數, 如要能接收多個可操作檔案描述符,則evetns應是epoll_event的陣列首位址.

// maxevents為events對應的陣列元素個數

// timeout為超時時間, -1表示沒時間限制

函式返回值, 為0表示超時.成功返回可讀檔案描述符個數,而且此檔案描述符的epoll_event資料已存放在events引數裡

嵌入式Linux的POLL SELECT 方式

版本 日期作者 說明v1 2020 韋東山摘自 嵌入式linux應用開發完全手冊 簡單地說,它們就是 定個鬧鐘 在呼叫 poll select 函式時可以傳入 超時時間 在這段時間內,條件合適時 比如有資料可讀 有空間可寫 就會立刻返回,否則等到 超時時間 結束時返回錯誤。用法如下。事件型別 說明p...

epoll程式設計例項客戶端 網路程式設計 epoll

前言 前面講了io多路復用的api,select和poll的缺點是效能不夠,客戶端連線越多效能下降越明顯,epoll的出現解決了這個問題,引用the linux programming inte ce的乙個統計對比如下 fd數量 poll cpu時間 秒 select cpu時間 秒 epoll c...

web伺服器 併發web伺服器實現 epoll

在linux的網路程式設計中,很長的時間都在使用select來做事件觸發。在linux新的核心中,有了一種替換它的機制,就是epoll。epoll 是當今 linux 系統採用的方式,一般伺服器都是用 epoll 來實現的。epoll 是一種方案,這種方案不使用多程序多執行緒多協程,而是使用單程序單...