epoll_wait 函数是 Linux 内核提供的一个系统调用,用于等待一个或多个文件描述符上的事件。它是 epoll 接口的一部分,专门用于处理多路复用 I/O,允许单个线程同时监听多个文件描述符,从而高效地处理大量的 I/O 事件。
参数
epoll_wait 函数的参数如下:
- int epfd
这是一个指向 epoll 实例的文件描述符,该实例是在调用 epoll_create1 系统调用时创建的。
- struct epoll_event *events
这是一个指向 epoll_event 结构的指针,该结构用于存储被监听的文件描述符及其相关的事件信息。这个数组包含了多个 epoll_event 结构,表示有多个文件描述符需要被监听。
- int maxevents
这是一个整数,表示 events 数组中可以存储的最大事件数量。
- int timeout
这是一个整数,表示等待事件的超时时间,单位是毫秒。如果设置为 -1,表示无限期等待;如果设置为 0,则表示立即返回,不会等待任何事件;如果设置为一个正数,则表示等待事件的最大时间。
返回值
epoll_wait 函数的返回值是 ssize_t 类型,表示实际 ready 的文件描述符的数量。如果返回值为 0,表示没有事件发生;如果返回值为 -1,则表示发生错误。
功能
epoll_wait 函数的功能是阻塞当前线程,直到有至少一个文件描述符准备好进行 I/O 操作(例如,可读、可写或异常等)。它会在 events 数组中填充准备好的事件,然后返回准备好的事件数。这样,应用程序就可以在一个循环中处理所有的事件,而不需要为每个文件描述符单独设置轮询或中断。
头文件
要使用 epoll_wait 函数,需要引入 sys/epoll.h 头文件,这个头文件包含了 epoll_wait 函数的声明和定义。
示例代码:
#include <sys/epoll.h>
#include <stdio.h>
#include <unistd.h>
int main() {
int epfd = epoll_create1(0);
if (epfd == -1) {
perror("epoll_create1");
return 1;
}
struct epoll_event event;
event.events = EPOLLIN; // 设置为监听可读事件
event.data.fd = STDIN_FILENO; // 设置要监听的文件描述符为标准输入
if (epoll_ctl(epfd, EPOLL_CTL_ADD, STDIN_FILENO, &event) == -1) {
perror("epoll_ctl");
return 1;
}
struct epoll_event events[10];
int nfds = epoll_wait(epfd, events, 10, -1);
if (nfds == -1) {
perror("epoll_wait");
return 1;
}
for (int i = 0; i < nfds; i++) {
if (events[i].data.fd == STDIN_FILENO) {
char buffer[1024];
ssize_t count = read(STDIN_FILENO, buffer, sizeof(buffer));
if (count == -1) {
perror("read");
return 1;
}
printf("Read %zd bytes\n", count);
}
}
close(epfd);
return 0;
}
在这个示例中,epoll_wait 被用来监听标准输入上的可读事件,当标准输入准备好读取时,它会返回一个事件,应用程序然后可以读取标准输入的数据。