读取event对应的clientfd内核缓冲区中的数据,解析协议,执行命令,得到返回结果,这个返回结果要返回给客户端,则再使用epoll_ctl注册clientfd的epoll_out事件到epoll,这个时候,我们会注意到clientfd上既有epoll_in,也有epoll_out,这样其实没有必要,客户端在这个时候等待返回结果,不会再输入命令,所以需要使用epoll_ctl...
int fd, struct epoll_event *event); //控制epoll上的事件 int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); //阻塞等待事件发生 同时在这些参数中,有一个重要的数据结构epoll_event。epoll_event结构体用于描述事件,包括文件描述符、事件类型和事件数据。其中的定义如下:...
argv[0]); return 1; } //声明epoll_event结构体的变量,ev用于注册事件,数组用于回传要处理的事件 struct epoll_event ev, event_list[EVENT_MAX_COUNT]; //生成用于处理accept的epoll专用的文件描述符 epfd = epoll_create(256); //生成epoll文件描述符,既在内核申请一空间,存放关注的socket fd上是否发生...
epoll_event结构体中的字段解释如下:events:表示epoll事件类型,包括可读、可写等。 data:表示用户数据,可以是一个指针或文件描述符等。events字段events字段可以是以下值之一:EPOLLIN:表示对应的文件描述符上有数据可读。 EPOLLOUT:表示对应的文件描述符上可以写入数据。 EPOLLRDHUP:表示对端已经关闭连接,或者关闭了写...
epoll_ctl 可以向指定的epoll上下文加入或删除文件描述符: 1 2 #include <sys/epoll.h> int epoll_ctl (int epfd, int op, int fd, struct epoll_event *event); 头文件<sys/epoll.h>中定义了epoll event结构体 1 2 3 4 5 6 7 8 9 struct epoll_event { _u32 events; union { void * ptr;...
EPOLL_CTL_DEL:从epfd中删除一个文件标识符 第三个参数是需要监听的文件标识符 第四个参数是告诉内核需要监听什么事, 结构体epoll_event结构如下: typedef union epoll_data { void *ptr; int fd; uint32_t u32; uint64_t u64; } epoll_data_t; ...
服务器,服务器通过调用accept函数可以得到于这个client对应的socket文件描述符,可以把这文件描述符赋给epoll_data的fd字段以便后面的读写操作在这个文件描述符上进行。epoll_event 结构体的events字段是表示感兴趣的事件和被触发的事件可能的取值为: EPOLLIN :表示对应的文件描述符可以读; ...
events:分配好的 epoll_event结构体数组,epoll将会把发生的事件复制到 events数组中(events不可以是空指针,内核只负责把数据复制到这个 events数组中,不会去帮助我们在用户态中分配内存。内核这种做法效率很高)。 maxevents:表示本次可以返回的最大事件数目,通常 maxevents参数与预分配的events数组的大小是相等的。
EPOLL_CTL_MOD:修改已经注册的fd的监听事件;EPOLL_CTL_DEL:从epfd中删除一个fd;对于未添加的fd,调用修改和删除操作,将会返回失败epoll_event结构体定义如下:typedefunionepoll_data{void*ptr;intfd;__uint32_tu32;__uint64_tu64;}epoll_data_t;//感兴趣的事件和被触发的事件structepoll_event{__uint32...