epoll技術,及其常用操作

2021-04-19 20:35:00 字數 1950 閱讀 3577

(epoll技術的介紹)

void addepoll(int kdpfd, __uint32_t events, void *ptr)

mutex.unlock();

} 備註1:_ev的型別為struct epoll_event _ev; kdpfd是epoll的控制代碼。可以man epoll_ctl來檢視各個引數及資料結構.

­如何使用int poll(struct pollfd *ufds, unsigned int nfds, int timeout)呢

poll()接受乙個指向結構'struct pollfd'列表的指標,其中包括了你想測試的檔案描述符和事件。事件由乙個在結構中事件域的位元掩碼確定。當前的結構在呼叫後將被填寫並在事件發生後返回。在svr4(可能更早的一些版本)中的 "poll.h"檔案中包含了用於確定事件的一些巨集定義。事件的等待時間精確到毫秒 (但令人困惑的是等待時間的型別卻是int),當等待時間為0時,poll()函式立即返回,-1則使poll()一直掛起直到乙個指定事件發生。下面是pollfd的結構。

struct pollfd

;      

於select()十分相似,當返回正值時,代表滿足響應事件的檔案描述符的個數,如果返回0則代表在規定事件內沒有事件發生。如發現返回為負則應該立即檢視 errno,因為這代表有錯誤發生。

如果沒有事件發生,revents會被清空,所以你不必多此一舉。

這裡是乙個例子

/* 檢測兩個檔案描述符,分別為一般資料和高優先資料。如果事件發生      則用相關描述符和優先度呼叫函式handler(),無時間限制等待,直到      錯誤發生或描述符掛起。*/      

#include

#include

#include

#include

#include

#include

#include

#include

#define normal_data 1  

#define hipri_data 2    

int poll_two_normal(int fd1,int fd2)  

if(((poll_list[0].revents&pollhup) == pollhup) ||     ((poll_list[0].revents&pollerr) == pollerr) || 

((poll_list[0].revents&pollnval) == pollnval) ||              ((poll_list[1].revents&pollhup) == pollhup)     || 

((poll_list[1].revents&pollerr) == pollerr) ||              ((poll_list[1].revents&pollnval) == pollnval))            

return 0;            

if((poll_list[0].revents&pollin) == pollin)           

handle(poll_list[0].fd,normal_data);        

if((poll_list[0].revents&pollpri) == pollpri) 

handle(poll_list[0].fd,hipri_data);     

if((poll_list[1].revents&pollin) == pollin) 

handle(poll_list[1].fd,normal_data); 

if((poll_list[1].revents&pollpri) == pollpri)

handle(poll_list[1].fd,hipri_data);      

}  

}

Linux I O復用技術 epoll

1.介紹 epoll和之前介紹的select poll有很大的差異,幾乎現在所有的高併發i o模型都使用epoll 如nginx include int epoll create int size int epoll ctl int epfd,int op,int fd,struct epoll e...

Linux I O多路轉接epoll技術

前面的兩篇部落格我們已經為大家介紹了select和poll函式,但是在學習中我們發現select和poll存在效率上的問題。而今天的主角epoll函式真的是讓人驚豔的設計,它是在2.5.44核心中被引進的,它幾乎具備了之前所說的一切優點,被公認為linux2.6下效能最好的多路i o就緒通知方法。包...

為什麼會有epoll技術

為什麼會有epoll這個技術的產生呢?select 和poll 函式,這兩系統函式每次呼叫都需要我們 提供給它所要需要偵聽的socket檔案描述符集合 select 和poll 函式的返回值是個int整型值,只能代表有 幾個socket就緒或者是有錯誤了 它沒辦法表示出是哪個 具體是哪幾個socke...