Linux 2.6 內核Epoll用法舉例說明

epoll用到的所有函數都是在頭文件sys/epoll.h中聲明的,下面簡要說明所用到的數據結構和函數:

所用到的數據結構:










 

typedef union epoll_data {
                void *ptr;
                int fd;
                __uint32_t u32;
                __uint64_t u64;
        } epoll_data_t;

        struct epoll_event {
                __uint32_t events;      /* Epoll events */
                epoll_data_t data;      /* User data variable */
        };

結構體epoll_event 被用於註冊所感興趣的事件和回傳所發生待處理的事件,其中epoll_data 聯合體用來保存觸發事件的某個文件描述符相關的數據,例如一個client連接到服務器,服務器通過調用accept函數可以得到於這個client對應的socket文件描述符,可以把這文件描述符賦給epoll_data的fd字段以便後面的讀寫操作在這個文件描述符上進行。epoll_event 結構體的events字段是表示感興趣的事件和被觸發的事件可能的取值爲:EPOLLIN :表示對應的文件描述符可以讀;

EPOLLOUT:表示對應的文件描述符可以寫;

EPOLLPRI:表示對應的文件描述符有緊急的數據可讀(我不太明白是什麼意思,可能是類似client關閉 socket連接這樣的事件);

EPOLLERR:表示對應的文件描述符發生錯誤;

EPOLLHUP:表示對應的文件描述符被掛斷;

EPOLLET:表示對應的文件描述符有事件發生;

所用到的函數:

1、epoll_create函數

函數聲明:int epoll_create(int size)

該函數生成一個epoll專用的文件描述符,其中的參數是指定生成描述符的最大範圍(我覺得這個參數和select函數的第一個參數應該是類似的但是該怎麼設置纔好,我也不太清楚)。

2、epoll_ctl函數

函數聲明:int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)

該函數用於控制某個文件描述符上的事件,可以註冊事件,修改事件,刪除事件。

參數:epfd:由 epoll_create 生成的epoll專用的文件描述符;

op:要進行的操作例如註冊事件,可能的取值EPOLL_CTL_ADD 註冊、EPOLL_CTL_MOD 修改、EPOLL_CTL_DEL 刪除

fd:關聯的文件描述符;

event:指向epoll_event的指針;如果調用成功返回0,不成功返回-1

3、epoll_wait函數

函數聲明:int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout)

該函數用於輪詢I/O事件的發生;

參數:

epfd:由epoll_create 生成的epoll專用的文件描述符;

epoll_event:用於回傳代處理事件的數組;

maxevents:每次能處理的事件數;

timeout:等待I/O事件發生的超時值;

返回發生事件數。

例子:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章