epoll示例代码C语言
时间: 2024-12-20 22:12:01 浏览: 8
Epoll(Event Polling)是Linux内核提供的一种高效、轻量级的I/O多路复用机制。在C语言中,我们可以使用epoll_create(), epoll_ctl(), 和 epoll_wait() 等函数来管理事件监听。下面是一个简单的epoll示例代码:
```c
#include <sys/epoll.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#define EPOLL_PORT 8080
#define MAX_EVENTS 10
int main() {
int epoll_fd = epoll_create(1); // 创建epoll实例
if (epoll_fd < 0) {
perror("epoll_create failed");
return -1;
}
// 创建socket并绑定到指定端口
int server_sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(EPOLL_PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(server_sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
perror("bind failed");
close(epoll_fd);
return -1;
}
listen(server_sock, 5); // 监听连接
struct epoll_event events[MAX_EVENTS];
for(int i = 0; i < MAX_EVENTS; ++i) {
events[i].events = EPOLLIN | EPOLLET; // 设置为边缘触发
events[i].data.fd = server_sock;
}
while (true) {
int num_events = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
if (num_events < 0) {
perror("epoll_wait failed");
break;
}
for(int i = 0; i < num_events; ++i) {
if (events[i].data.fd == server_sock && events[i].events & EPOLLIN) { // 新的连接到来
accept(server_sock, NULL, NULL); // 接受连接并处理
}
}
}
close(epoll_fd);
close(server_sock);
return 0;
}
```
在这个例子中,我们首先创建了一个epoll实例,并设置一个socket监听端口。然后将socket加入epoll,并设置为边缘触发(EPOLLET)。当有新的连接到达时,epoll_wait会立即唤醒我们的进程。当离开循环时,关闭epoll和socket。
阅读全文