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則是用來填補遺漏功能的。
相關文章
- 企業級開發框架----------Django框架Django
- 企業級 Web 開發的挑戰Web
- 微服務PaaS框架,RestCloud企業級開發框架微服務框架RESTCloud
- 低程式碼開發平臺,快速開發企業級系統
- 區塊鏈技術開發主鏈 區塊鏈的企業級應用剖析區塊鏈
- 企業級軟體開發新模式:低程式碼模式
- 百億級企業級 RPC 框架開源了!RPC框架
- 安全可控的企業級低程式碼開發平臺
- 快速構建企業級應用的開發平臺
- 區塊鏈技術應用物流實體落地開發,企業級區塊鏈服務區塊鏈
- 大咖助陣全球企業級OpenSCA技術開源釋出會
- 企業級軟體系統開發為何這麼貴?
- KubeSphere 宣佈開源 Thanos 的企業級發行版 Whizard
- 從開發平臺到智慧供應鏈,AI技術如何推動企業智慧化升級?AI
- ASP.NET Core 6 從入門到企業級實戰開發應用技術彙總ASP.NET
- 微信開發系列----企業付款到銀行卡介面開發
- 如何開展超大型企業IT中心的企業級需求管理
- 議程丨全球首款企業級OpenSCA技術開源釋出會
- 從0開發一個iOS企業級專案效果介紹iOS
- Oracle開發:構建強大企業級應用的關鍵Oracle
- 低程式碼平臺!企業級應用開發模式首選模式
- 力軟敏捷開發框架,快速搭建企業級應用系統敏捷框架
- 企業級JAVAJava
- Vue3 + Vite2 + TypeScript + Pinia(Vuex)+JSX 搭建企業級開發腳手架【開箱即用】VueViteTypeScriptJS
- 雲端計算開發技術,企業linux運維掌握這些技術才不會被淘汰Linux運維
- 《SpringBoot實戰開發》——基於Gradle+Kotlin的企業級應用開發最佳實踐Spring BootGradleKotlin
- 花式填坑13期 | 如何高效開發企業級電商的前端?前端
- 企業級應用建設之道:高程式碼+低程式碼開發
- 企業級容器PaaS技術沙龍-4.14相約北京
- 騰訊再開源三項技術,提升企業開發及運營效率
- 基於jQuery的前端開發框架,在企業級開發領域裡已經涼了嗎?jQuery前端框架
- 地表最全企業級微信小程式開發流程(幫你儘可能減少開發週期)微信小程式
- SpringCloud微服務實戰——搭建企業級開發框架(六):使用knife4j整合Swagger2介面文件SpringGCCloud微服務框架Swagger
- 區塊鏈技術應用企業平臺落地系統開發區塊鏈
- 企業級低程式碼平臺,J2PaaS三大核心能助力軟體開發!
- 物流行業企業報表開發指南行業
- 企業級javaspringbootb2bc商城系統開源原始碼二次開發:服務消費(Ribbon)JavaSpring Boot原始碼
- 企業管理系統-ERP開發
- 企業級短連結生成介面API推薦API