EPOLL使用心得

2021-07-03 16:21:14 字數 2611 閱讀 1786

關於epoll是幹什麼的,網上已經有很多了,不再贅述,我就是想寫寫我是怎麼用的,很初級的用法。

epoll的用法非常簡單,簡單到三個函式已經足夠了。他們分別是

int epoll_create(int

size)

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
該函式用於控制某個epoll fd上的事件,可以註冊,修改,刪除事件。

引數:

1. epfd 這個沒什麼好說,就是你想作用的epoll fd

2. op 對epoll fd要進行的操作。可取的有epoll_ctl_add epoll_ctl_mod epoll_ctl_del

3. fd 關聯的檔案描述符,一般是某個socket fd

4. event 指向epoll_event的指標

如果呼叫成功返回0,失敗則返回-1

epoll_ctl中用到的資料結構

typedef

union epoll_data epoll_data_t;

struct epoll_event ;

在epoll_data中,我們可以自定義需要的東西,所用到的就是void *ptr,他可以指向乙個自定義的資料結構,在那個資料結構中,我們可以定義callback函式,或者一些類似狀態的東西,供epoll fd被喚醒時用。

epoll_event中的events有如下幾種事件型別:

1. epollin:可讀

2. epollout:可寫

3. epollpri:有緊急的資料可讀

4. epollerr:發生錯誤

5. epollhup:被結束通話

6. epollet:有事件發生

在設定要處理的事件型別時,我們一般這麼寫:ev.events=epollin|epollout;

int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout)
用於輪詢epfd上i/o事件的發生

引數:

1. epfd:由epoll_create生成的epoll fd

2. epoll_event:用於回傳待處理事件的陣列

3. maxevents:每次能處理的最多的事件數

4. timeout:等待i/o事件發生的超時值

用法如下所示:

//build the epoll event for recall

struct epoll_event ev[20];

int nfds = epoll_wait(epoll_fd,ev,20,1000);

for(int i=0; iif(ev[i].data.fd==sock)

...}

epoll_wait執行的原理是

等侍註冊在epfd上的socket fd的事件的發生,如果發生則將發生的sokct fd和事件型別放入到events陣列中。

需要注意的是:

epoll_wait會將註冊在epfd上的socket fd的事件型別給清空,所以如果下乙個迴圈你還要關注這個socket fd的話,則需要用epoll_ctl(epfd,epoll_ctl_mod,listenfd,&ev)來重新設定socket fd的事件型別。這時不用epoll_ctl_add,因為socket fd並未清空,只是事件型別清空。這一步非常重要。

epoll有兩種工作方式:lt和et,預設是lt。

lt(level triggered)是預設的工作方式,並且同時支援block和no-block socket.在這種做法中,核心告訴你乙個檔案描述符是否就緒了,然後你可以對這個就緒的fd進行io操作。如果你不作任何操作,核心還是會繼續通知你的,所以,這種模式程式設計出錯誤可能性要小一點。傳統的select/poll都是這種模型的代表.

et (edge-triggered)是高速工作方式,只支援no-block socket。在這種模式下,當描述符從未就緒變為就緒時,核心通過epoll告訴你。然後它會假設你知道檔案描述符已經就緒,並且不會再為那個檔案描述符傳送更多的就緒通知,直到你做了某些操作導致那個檔案描述符不再為就緒狀態了(比如,你在傳送,接收或者接收請求,或者傳送接收的資料少於一定量時導致了乙個ewouldblock 錯誤)。但是請注意,如果一直不對這個fd作io操作(從而導致它再次變成未就緒),核心不會傳送更多的通知(only once)。所以在這種情況下,et讀的讀要一直讀,寫要一直寫,對程式設計師提出了更高的要求。

如果程式中用了兩個執行緒,乙個監聽accept,用乙個監聽epoll_wait,這個時候listen socket fd用預設的阻塞就好了。如果只有乙個執行緒,那麼listen socket

fd在建立的時候就要對他進行非阻塞的宣告。

fcntl(listenfd, f_setfl, o_nonblock);

frameset 使用心得

欲明白本篇 html徹底剖析 之標記分類,請看 標記一覽 也請先明白圍堵標記與空標記的分別,請看 html概念 框架概念 謂框架便是網頁畫面分成幾個框窗,同時取得多個 url。只需要 即可,面所有框架標記需要放在乙個總起的 html 檔,這個檔案只記錄了該框架如何分割 不會顯示任何資料,所以不必放入...

Access使用心得

今天臨時用access做資料庫,長期用sql server開發習慣了,總結一下現在為止用到的比較大的差異,以後有新的再補了 1 返回字串長度 len s lenb s 前者返回字元數,後者返回位元組數,並且access中text型別字元統一為2位元組,與sql2000不同。2 join的使用 acc...

vmware使用心得

成功在winxp環境中安裝了vista business版本,反之,亦然。可以建立工作組網路連線了,虛擬機器也可以訪問網際網路了。安裝說明 在安裝嚮導中,無論使用哪種網路連線形式,都不影響正確安裝。安裝後,可以編輯本地機和虛擬機器之間的網路連線形式。需要注意三個細節問題 1 網絡卡要設定為 電源啟動...