epoll_wait 函数是 Linux 系统提供的用于多路复用 IO (I/O multiplexing) 的函数,它可以等待多个文件描述符上的事件发生。\n\n该函数的原型如下:\n\nc\nint epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);\n\n\n参数说明:\n- epfd:epoll 的文件描述符,即调用 epoll_create 函数返回的文件描述符。\n- events:用于存储事件的数组。\n- maxeventsevents 数组的大小,即最多可以存储多少个事件。\n- timeout:等待事件的超时时间,单位是毫秒 (ms),传递 -1 表示无限等待,传递 0 表示立即返回。\n\nepoll_wait 函数会阻塞等待事件的发生,当有事件发生时,函数会返回,并将事件信息填充到 events 数组中。\n\nevents 是一个数组,每个元素都是一个 struct epoll_event 结构体,该结构体定义如下:\n\nc\ntypedef union epoll_data {\n void *ptr;\n int fd;\n uint32_t u32;\n uint64_t u64;\n} epoll_data_t;\n\nstruct epoll_event {\n uint32_t events; // 表示事件类型\n epoll_data_t data; // 用户数据\n};\n\n\nevents 表示事件类型,可以是以下值的按位或:\n- EPOLLIN:表示对应的文件描述符可以读(包括对端关闭连接)。\n- EPOLLOUT:表示对应的文件描述符可以写。\n- EPOLLRDHUP:表示对端关闭连接或者半关闭。\n- EPOLLHUP:表示挂起事件,通常是对端关闭连接。\n- EPOLLERR:表示错误事件。\n\ndata 字段是一个 epoll_data_t 类型的联合体,用于保存用户数据。可以通过 ptr 字段获取用户自定义的数据。\n\n在使用 epoll_wait 函数之前,需要先调用 epoll_create 函数创建一个 epoll 的文件描述符,然后使用 epoll_ctl 函数向 epoll 中添加需要监听的文件描述符和事件类型。\n\n以下是一个使用 epoll_wait 函数的简单示例:\n\nc\n#include <stdio.h>\n#include <sys/epoll.h>\n\n#define MAX_EVENTS 10\n\nint main() {\n int epoll_fd = epoll_create(1); // 创建 epoll 的文件描述符\n if (epoll_fd == -1) {\n perror("epoll_create");\n return 1;\n }\n\n struct epoll_event event;\n event.events = EPOLLIN; // 监听可读事件\n event.data.fd = 0; // 监听标准输入\n\n // 向 epoll 中添加需要监听的文件描述符和事件类型\n if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, 0, &event) == -1) {\n perror("epoll_ctl");\n return 1;\n }\n\n struct epoll_event events[MAX_EVENTS];\n int num_events;\n\n while (1) {\n // 等待事件发生\n num_events = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);\n if (num_events == -1) {\n perror("epoll_wait");\n return 1;\n }\n\n printf("Got %d events\n", num_events);\n\n // 处理事件\n for (int i = 0; i < num_events; i++) {\n if (events[i].data.fd == 0) {\n char buf[1024];\n int num_read = read(0, buf, sizeof(buf)); // 读取标准输入\n if (num_read == -1) {\n perror("read");\n return 1;\n }\n printf("Read %d bytes from stdin\n", num_read);\n printf("Input: %s\n", buf);\n }\n }\n }\n\n return 0;\n}\n\n\n在上述示例中,首先创建了一个 epoll 的文件描述符,然后添加需要监听的文件描述符和事件类型,接着进入事件循环,调用 epoll_wait 函数等待事件的发生,当有事件发生时,处理事件,并继续等待下一个事件的发生。\n\n注意:上述示例只监听了标准输入上的可读事件,其他事件类型和文件描述符可以根据需求进行相应的添加和处理。

Linux epoll_wait 函数详解:高效的多路复用 I/O 实现

原文地址: https://www.cveoy.top/t/topic/qvLq 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录