基于epoll 和 函数指针,生成采用回调的事件监听代码
时间: 2024-10-23 07:13:29 浏览: 32
在Linux系统中,Epoll是一种高效事件驱动的I/O多路复用机制,它允许一个进程监控多个文件描述符,当某个描述符上发生可读、可写或异常等事件时,Epoll会通知我们。而函数指针用于将具体的处理逻辑关联到特定的事件上,形成回调机制。
下面是一个基于Epoll和函数指针的简单示例,展示了如何创建一个事件监听者并注册回调:
```c
#include <sys/epoll.h>
#include <stdio.h>
#include <string.h>
// 假设我们有两个回调函数,分别对应于读和写的操作
typedef void (*event_callback)(int fd, int event);
void on_read(int fd, int event) {
printf("File descriptor %d is readable.\n", fd);
}
void on_write(int fd, int event) {
printf("File descriptor %d is writable.\n", fd);
}
int main() {
// 初始化Epoll实例
epoll_event events[10];
int epoll_fd = epoll_create1(0); // 创建一个新的Epoll实例
// 注册文件描述符及其事件类型和回调
struct epoll_event event;
event.events = EPOLLIN | EPOLLET; // 监听读事件
event.data.fd = socketpair(AF_UNIX, SOCK_STREAM, 0, NULL); // 创建套接字对
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, event.data.fd, &event) == -1) {
perror("epoll_ctl add");
return -1;
}
event.callback = on_read; // 将读事件回调设置为on_read
// 类似地,可以再注册一个写事件,替换event.callback为on_write
// 进入主循环等待事件
while (true) {
int num_events = epoll_wait(epoll_fd, events, sizeof(events), -1);
if (num_events > 0) {
for (int i = 0; i < num_events; ++i) {
if (events[i].data.fd == event.data.fd && events[i].events & EPOLLIN) {
event.callback(event.data.fd, events[i].events); // 调用对应的回调
}
}
}
}
close(epoll_fd);
return 0;
}
```
在这个例子中,当你创建的套接字准备好读取时,`on_read`函数会被自动调用。同样,你可以为写事件添加另一个回调。
阅读全文