linux下關於epoll的簡單介紹

2021-12-30 10:19:45 字數 1668 閱讀 8393

在linux的man文件中,我們可以看到如下定義

epoll - i/o event notification facility

epoll是一種 i/o事件 通知機制

i/o事件

基於file descriptor,支援file, socket, pipe等各種i/o方式

當檔案描述符關聯的核心讀緩衝區可讀,則觸發可讀事件,什麼是可讀呢?就是核心緩衝區非空,有資料可以讀取

當檔案描述符關聯的核心寫緩衝區可寫,則觸發可寫事件,什麼是可寫呢?就是核心緩衝區不滿,有空閒空間可以寫入

通知機制

通知機制,就是當事件發生的時候,去通知他

通知機制的反面,就是輪詢機制

也就是說

epoll是一種當檔案描述符的核心緩衝區非空的時候,發出可讀訊號進行通知,當寫緩衝區不滿的時候,發出可寫訊號通知的機制

水平觸發(level-trggered)

只要檔案描述符關聯的讀核心緩衝區非空,有資料可以讀取,就一直發出可讀訊號進行通知,

當檔案描述符關聯的核心寫緩衝區不滿,有空間可以寫入,就一直發出可寫訊號進行通知

邊緣觸發(edge-triggered)

當檔案描述符關聯的讀核心緩衝區由空轉化為非空的時候,則發出可讀訊號進行通知,

當檔案描述符關聯的核心寫緩衝區由滿轉化為不滿的時候,則發出可寫訊號進行通知

兩者的區別在**呢?水平觸發是只要讀緩衝區有資料,就會一直觸發可讀訊號,而邊緣觸發僅僅在空變為非空的時候通知一次,舉個例子:

讀緩衝區剛開始是空的

讀緩衝區寫入2kb資料

水平觸發和邊緣觸發模式此時都會發出可讀訊號

收到訊號通知後,讀取了1kb的資料,讀緩衝區還剩餘1kb資料

水平觸發會再次進行通知,而邊緣觸發不會再進行通知

所以邊緣觸發需要一次性的把緩衝區的資料讀完為止,也就是一直讀,直到讀到egain為止,egain說明緩衝區已經空了,因為這一點,邊緣觸發需要設定檔案控制代碼為非阻塞

//水平觸發

ret = read(fd, buf, sizeof(buf));

//邊緣觸發

while(true) epoll_data_t;

struct epoll_event {

uint32_t events; /* epoll events */

epoll_data_t data; /* user data variable */

events可以是一組bit的組合

epollin:可讀

epollout: 可寫

epollet: 邊緣觸發,預設是水平觸發

一句話來描述:就是對於註冊到epfd中的fd檔案描述符,執行op event的操作

epoll_wait

epoll_wait等待epoll例項中註冊的事件觸發

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout)

epfd: epoll例項檔案描述符

events: 陣列出參,用來記錄被觸發的events,其大小應該和maxevents一致

maxevents: 返回的events的最大個數,如果最大個數大於實際觸發的個數,則下次epoll_wait的時候仍然可以返回

timeout: 等待事件,毫秒為單位 -1:無限等待 0:立即返回

Linux下關於時間的函式

標頭檔案 includestruct timeval 其中tv sec是由凌晨開始算起的秒數,tv usec則是微秒 10e 6 second struct timezone tv minuteswest是格林威治時間往西方的時差,tv dsttime則是時間的修正方式。struct timespe...

Linux下關於snmp的snmpwalk命令

最後,普及下snmpwalk命令 可使用snmpwalk檢視支援snmp協議的裝置的一些資訊,如cisco交換機或路由器ip位址等,也可用來協助開發snmp功能。用法 snmpwalk v 1或2 代表snmp版本 c snmp讀密碼 ip位址 oid 物件標示符 1 v 指定snmp的版本,1或者...

linux下關於檔案許可權的控制

1.為什麼需要檔案許可權的存在?給檔案加上許可權,可有效對檔案進行保護,防止對檔案的惡意篡改。2.檢視檔案許可權的命令 方式一 ls l 檔名 方式二 ls ld 檔案路徑 3.關於許可權的理解 1 檔案 rw r r 1 root root 0 aug 15 04 58 day03 各引數解釋如下...