在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 各引數解釋如下...