epoll 基础API

来源:互联网 发布:淘宝抢购秒杀快速付款 编辑:程序博客网 时间:2024/05/22 13:08

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