【linux高级IO】初识epoll
epoll是Linux中的一个系统调用,它提供了一种高效的方法来监视多个文件描述符,以查看其是否有读写事件发生。epoll的相关操作可以使用以下API完成:
epoll_create
:创建一个epoll的句柄。epoll_ctl
:向epoll对象中添加/修改/删除文件描述符。epoll_wait
:等待I/O事件的发生。
下面是使用epoll的一个简单示例:
#include <stdio.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <unistd.h>
int main() {
int epfd, nfds;
struct epoll_event event;
struct epoll_event *events;
epfd = epoll_create(1); // 创建epoll句柄
if (epfd < 0) {
perror("epoll_create");
exit(EXIT_FAILURE);
}
event.data.fd = STDIN_FILENO; // 添加标准输入到epoll
event.events = EPOLLIN | EPOLLET; // EPOLLIN表示感兴趣的事件是读事件
if (epoll_ctl(epfd, EPOLL_CTL_ADD, STDIN_FILENO, &event) < 0) {
perror("epoll_ctl");
exit(EXIT_FAILURE);
}
events = calloc(10, sizeof(struct epoll_event)); // 分配用于epoll返回事件的空间
for (;;) {
nfds = epoll_wait(epfd, events, 10, -1); // 等待事件发生
for (int n = 0; n < nfds; n++) {
if (events[n].data.fd == STDIN_FILENO) {
char buffer[10];
int count = read(STDIN_FILENO, buffer, 10);
if (count > 0) {
buffer[count] = '\0';
printf("Read: %s\n", buffer);
} else if (count < 0) {
perror("read");
}
}
}
}
close(epfd); // 清理
free(events);
return 0;
}
这段代码创建了一个epoll实例,并将标准输入(STDIN\_FILENO)添加到epoll中。然后,它进入一个循环,等待任何注册的文件描述符上的事件。当有事件发生时(比如用户输入),它将读取输入并打印。这个例子展示了如何使用epoll来高效地处理多个文件描述符的I/O事件。
评论已关闭