epoll使用

    技术2022-05-20  38

    epoll使用        epoll的工作原理是,你如果想进行IO操作时,先向epoll查询是否可读或可写,如果处于可读或可写状态后,epoll会通过epoll_wait函数通知你,此时你再进行进一步的recv或send操作。        epoll仅仅是一个异步事件的通知机制,其本身并不作任何的IO读写操作,它只负责告诉你是不是可以读或可以写了,而具体的读写操作,还要应用层自己来作。epoll仅提供这种机制也是非常好的,它保持了事件通知与IO操作之间彼此的独立性,使得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字段以便后面的读写操作在这个文件描述符上进行      a、*ptr: 通过指针ptr携带应用层数据, 当事件的通知到来时,它不仅告诉你发生了什么样的事件,还同时告诉这次事件所操作的数据是哪些          epoll_event 结构体的events字段是表示感兴趣的事件和被触发的事件可能的取值为:      EPOLLIN :表示对应的文件描述符可以读;      EPOLLOUT:表示对应的文件描述符可以写;      EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);      EPOLLERR:表示对应的文件描述符发生错误;      EPOLLHUP:表示对应的文件描述符被挂断;      EPOLLET:表示对应的文件描述符有事件发生;所用到的函数:1、epoll_create函数     函数声明:int epoll_create(int size)     该函数生成一个epoll专用的文件描述符,其中的参数是指定生成描述符的最大范围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,不成功返回-13、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事件发生的超时值;返回发生事件数。 


    最新回复(0)