如何在C ++中将回调函数指针传递给epoll_event结构

时间:2015-02-11 04:29:15

标签: c++ linux timer callback epoll

我一直在搜索this question的答案,我在Linux中遇到了函数timerfd_createepoll。在教程中,有人说epoll_ctl()有一个epoll_data_t结构的epoll_event联盟成员,可用于在callback事件上执行timerfd函数射击。但我不知道该怎么做。任何人都可以帮忙。

1 个答案:

答案 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

这样,如果所有我们放入EventHandlerint n = epoll_wait (epollfd, events , num_events, -1 ); for (int i = 0; i < n; ++i) { static_cast<EventHandler*>(events[i].data.ptr)->fire(); }

{{1}}