linux c epoll示例
时间: 2024-12-10 14:47:44 浏览: 12
在Linux C语言中,epoll通常用于创建一个事件处理器,可以监听多个文件描述符(如网络连接、定时器等)。下面是一个简单的epoll示例,展示如何创建并使用epoll:
```c
#include <stdio.h>
#include <sys/epoll.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main() {
int epoll_fd; // 创建epoll句柄
int fd1 = socket(AF_INET, SOCK_STREAM, 0); // 创建socket
struct epoll_event ev;
// 将socket添加到epoll监听
ev.events = EPOLLIN | EPOLLET;
ev.data.fd = fd1;
if (epoll_create(1, &epoll_fd) == -1) {
perror("epoll_create failed");
return -1;
}
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd1, &ev) == -1) {
perror("epoll_ctl failed");
close(epoll_fd);
return -1;
}
printf("Socket %d added to epoll.\n", fd1);
// 主循环,等待事件发生
while (true) {
epoll_event events[10]; // 存放事件
int num_events = epoll_wait(epoll_fd, events, 10, -1); // 等待事件
for (int i = 0; i < num_events; ++i) {
if (events[i].data.fd == fd1 && (events[i].events & EPOLLIN)) {
char buffer[1024];
ssize_t len = read(fd1, buffer, sizeof(buffer));
if (len > 0) {
printf("Received data: '%s'\n", buffer);
} else {
perror("read error");
}
}
}
}
close(epoll_fd); // 关闭epoll
return 0;
}
```
在这个例子中,我们首先创建了一个epoll句柄,然后将一个新的socket添加进去。接着进入主循环,`epoll_wait`函数会阻塞直到指定的文件描述符上发生了可读事件。一旦事件触发,我们就从socket接收数据并进行处理。
注意,这是一个非常基础的示例,实际应用中还需要处理更多复杂情况,比如错误处理、多个文件描述符、事件移除等。
阅读全文