Linux企業級開發技術(2)——epoll企業級開發之epoll介面
epoll的介面非常簡單,總共只有三個函式:
1、int epoll_create(intsize);
生成一個 Epoll 專用的檔案描述符,size用來告訴核心這個監聽的數目一共有多大。這個引數不同於select()中的第一個引數,給出最大監聽的fd+1的值。需要注意的是,當建立好epoll控制程式碼後,它就是會佔用一個fd值,在linux下如果檢視/proc/程式id/fd/,是能夠看到這個fd的,所以在使用完epoll後,必須呼叫close()關閉,否則可能導致fd被耗盡。
其實是申請一個核心空間,用來存放你想關注的 socket fd 上是否發生以及發生了什麼事件。 size 就是你在這個 Epoll fd 上能關注的最大 socket fd 數,大小自定,只要記憶體足夠。
2、int epoll_ctl(intepfd, int op, int fd, struct epoll_event *event);
epoll的事件註冊函式,它不同與select()是在監聽事件時告訴核心要監聽什麼型別的事件,而是在這裡先註冊要監聽的事件型別。它用來控制某個epoll 檔案描述符上的事件:註冊、修改、刪除。其中引數 epfd 是 epoll_create() 建立 Epoll 專用的檔案描述符。相當於 select 模型中的 FD_SET 和 FD_CLR 巨集。
第一個引數是epoll_create()的返回值,
第二個參數列示動作,用三個巨集來表示:
EPOLL_CTL_ADD:註冊新的fd到epfd中;
EPOLL_CTL_MOD:修改已經註冊的fd的監聽事件;
EPOLL_CTL_DEL:從epfd中刪除一個fd;
第三個引數是需要監聽的fd,
第四個引數是告訴核心需要監聽什麼事,struct epoll_event結構如下:
struct epoll_event {
__uint32_t events; /* Epollevents */
epoll_data_t data; /* User datavariable */
};
events可以是以下幾個巨集的集合:
EPOLLIN : 表示對應的檔案描述符可以讀(包括對端SOCKET正常關閉);
EPOLLOUT: 表示對應的檔案描述符可以寫;
EPOLLPRI: 表示對應的檔案描述符有緊急的資料可讀(這裡應該表示有帶外資料到來);
EPOLLERR: 表示對應的檔案描述符發生錯誤;
EPOLLHUP: 表示對應的檔案描述符被結束通話;
EPOLLET: 將EPOLL設為邊緣觸發(EdgeTriggered)模式,這是相對於水平觸發(Level Triggered)來說的。
EPOLLONESHOT: 只監聽一次事件,當監聽完這次事件之後,如果還需要繼續監聽這個socket的話,需要再次把這個socket加入到EPOLL佇列裡
3、int epoll_wait(intepfd, struct epoll_event * events, int maxevents, int timeout);
等待I/O事件的產生,類似於select()呼叫。
引數說明:
epfd: 由 epoll_create() 生成的 Epoll 專用的檔案描述符;
epoll_event: 用於回傳代處理事件的陣列;
maxevents: 每次能處理的事件數;
timeout: 等待 I/O 事件發生的超時值;
返回發生事件數。
引數events用來從核心得到事件的集合,maxevents告之核心這個events有多大,這個maxevents的值不能大於建立epoll_create()時的size,引數timeout是超時時間(毫秒,0會立即返回,-1將不確定,也有說法說是永久阻塞)。該函式返回需要處理的事件數目,如返回0表示已超時。
4、其他epoll_XXX() 系統呼叫
在RHEL6的核心(主要基於2.6.32)裡,還有兩個與epoll有關的系統呼叫:
epoll_pwait(),epoll_create1()。這些只是上面三個系統呼叫的包裝而已。pwait是做了與程式訊號有關的工作,create1則是用來填補遺漏功能的。
相關文章
- Linux企業級開發技術(3)——epoll企業級開發之epoll模型Linux模型
- Linux企業級開發技術(4)——epoll企業級開發之epoll例程Linux
- Linux企業級開發技術(1)——epoll企業級開發之簡介Linux
- Linux企業級開發技術(6)——libevent企業級開發之記憶體管理Linux記憶體
- Linux企業級開發技術(7)——libevent企業級開發之鎖和執行緒Linux執行緒
- Linux企業級專案實踐之網路爬蟲(19)——epoll介面Linux爬蟲
- 企業級開發框架----------Django框架Django
- 企業級 Web 開發的挑戰Web
- 關於PHP在企業級開發領域的訪談——企業級開發,PHP準備好了嗎?PHP
- 我學Ajax企業級開發 之 Ajax構建塊
- 微服務PaaS框架,RestCloud企業級開發框架微服務框架RESTCloud
- 如何快速開發Java RCP企業級應用?Java
- 低程式碼開發平臺,快速開發企業級系統
- 30.企業級開發進階2:網路程式設計程式設計
- 企業級軟體開發新模式:低程式碼模式
- 區塊鏈技術開發主鏈 區塊鏈的企業級應用剖析區塊鏈
- 30.4. 企業級開發進階2.4:服務端快捷開發服務端
- 安全可控的企業級低程式碼開發平臺
- 快速構建企業級應用的開發平臺
- 20. 企業級開發基礎1:自定義模組
- 23. 企業級開發基礎4:物件導向物件
- 22. 企業級開發基礎3:類和物件物件
- 微信開發系列----企業付款到銀行卡介面開發
- 百億級企業級 RPC 框架開源了!RPC框架
- 21. 企業級開發基礎2:使用第三方模組
- 區塊鏈技術應用物流實體落地開發,企業級區塊鏈服務區塊鏈
- IOS企業版開發iOS
- 企業級軟體系統開發為何這麼貴?
- 33.企業級開發進階6:資料庫操作資料庫
- 32.企業級開發進階4:正規表示式
- 28. 企業級開發基礎9:異常處理
- 30.2. 企業級開發進階2.2:TCP實戰TCP
- 關於企業級應用和web開發的區別Web
- 用Servlet開發企業級三層Web應用(一) (轉)ServletWeb
- KubeSphere 宣佈開源 Thanos 的企業級發行版 Whizard
- 《企業級ios應用開發實戰》一第1章企業應用的話題iOS
- 大咖助陣全球企業級OpenSCA技術開源釋出會
- 從開發平臺到智慧供應鏈,AI技術如何推動企業智慧化升級?AI