epoll 基礎API

1.創建一個epoll句柄,參數size用來告訴內核監聽的文件描述符的個數,跟內存大小有關。

#include <sys/epoll.h>
int epoll_create(int size)  size:監聽數目

2. 控制某個epoll監控的文件描述符上的事件:註冊、修改、刪除。

#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
    epfd:   爲epoll_creat的句柄
    op:     表示動作,用3個宏來表示:
        EPOLL_CTL_ADD (註冊新的fd到epfd),
        EPOLL_CTL_MOD (修改已經註冊的fd的監聽事件),
        EPOLL_CTL_DEL (從epfd刪除一個fd);
    event:  告訴內核需要監聽的事件

    struct epoll_event {
        __uint32_t events; /* Epoll events */
        epoll_data_t data; /* User data variable */
    };
    typedef union epoll_data {
        void *ptr;
        int fd;
        uint32_t u32;
        uint64_t u64;
    } epoll_data_t;

    EPOLLIN :   表示對應的文件描述符可以讀(包括對端SOCKET正常關閉)
    EPOLLOUT:   表示對應的文件描述符可以寫
    EPOLLPRI:   表示對應的文件描述符有緊急的數據可讀(這裏應該表示有帶外數據到來)
    EPOLLERR:   表示對應的文件描述符發生錯誤
    EPOLLHUP:   表示對應的文件描述符被掛斷;
    EPOLLET:    將EPOLL設爲邊緣觸發(Edge Triggered)模式,這是相對於水平觸發(Level Triggered)而言的
    EPOLLONESHOT:只監聽一次事件,當監聽完這次事件之後,如果還需要繼續監聽這個socket的話,需要再次把這個socket加入到EPOLL隊列裏

3.等待所監控文件描述符上有事件的產生,類似於select()調用。

#include <sys/epoll.h>
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout)
    events:     用來存內核得到事件的集合,
    maxevents:  告之內核這個events有多大,這個maxevents的值不能大於創建epoll_create()時的size,
    timeout:    是超時時間
        -1: 阻塞
        0:  立即返回,非阻塞
        >0: 指定毫秒
    返回值:    成功返回有多少文件描述符就緒,時間到時返回0,出錯返回-1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章