我一直在搜索this question的答案,我在Linux中遇到了函数timerfd_create
和epoll
。在教程中,有人说epoll_ctl()
有一个epoll_data_t
结构的epoll_event
联盟成员,可用于在callback
事件上执行timerfd
函数射击。但我不知道该怎么做。任何人都可以帮忙。
答案 0 :(得分:3)
您不能将回调函数指针放入epoll_event
,因为它不适合任何这些插槽:
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
你可以做的是将计时器fd存储在epoll_event
中并检查是否是那个发射的那个:
epoll_event ev;
ev.data.fd = timerfd;
epoll_ctl(epollfd, EPOLL_CTL_ADD, timerfd, &ev);
使用该设置,当我们致电epoll_wait
时,我们可以查看event
被解雇的timerfd
是否为int n = epoll_wait (epollfd, events , num_events, -1 );
for (int i = 0; i < n; ++i) {
if (events[i].data.fd == timerfd) {
handle_timer_callback();
}
else {
// something else
}
}
:
class EventHandler {
public:
virtual ~EventHandler() = default;
virtual int fd() const = 0;
virtual void fire() = 0;
};
或者,如果您愿意放弃某些性能,则可以为事件创建完整的对象层次结构:
EventHandler*
您可以将ptr
存储到EventHandler* handler = new TimerHandler();
ev.data.ptr = handler;
epoll_ctl(epollfd, EPOLL_CTL_ADD, handler->fd(), &ev);
:
epoll
这样,如果所有我们放入EventHandler
是int n = epoll_wait (epollfd, events , num_events, -1 );
for (int i = 0; i < n; ++i) {
static_cast<EventHandler*>(events[i].data.ptr)->fire();
}
:
{{1}}