如何在C ++中将回调函数指针传递给epoll_event结构 [英] How to pass a callback function pointer to epoll_event structure in C++

查看:620
本文介绍了如何在C ++中将回调函数指针传递给epoll_event结构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在寻找这个问题的答案,我在Linux中遇到了 timerfd_create epoll 函数。在一个教程中,有人说 epoll_ctl()具有 epoll_data_t epoll_event联合成员结构,可用于在 timerfd 事件触发时执行回调函数。但是我不确定该怎么做。有人可以帮忙吗?

I have been searching an answer for this question and I came across the functions timerfd_create and epollin Linux. In a tutorial it was said that epoll_ctl() has an epoll_data_t union member of the epoll_event structure which can be used to execute a callback function on a timerfd event firing. But I am not sure on how to do it. Can anyone please help.

推荐答案

您不能将回调函数指针放入 epoll_event ,因为它不适合以下任何插槽:

You can't put a callback function pointer into epoll_event because it can't fit in any of these slots:

typedef union epoll_data {
    void        *ptr;
    int          fd;
    uint32_t     u32;
    uint64_t     u64;
} epoll_data_t;

您可以做的是将计时器fd存储在 epoll_event 并检查是否触发该事件:

What you could do instead is store the timer fd in the epoll_event and check to see if that's the one that fires:

epoll_event ev;
ev.data.fd = timerfd;

epoll_ctl(epollfd, EPOLL_CTL_ADD, timerfd, &ev); 

使用该设置,然后我们调用 epoll_wait ,我们可以检查触发的事件是否用于 timerfd

With that setup, then when we call epoll_wait, we can check to see if the event that fired was for 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
    }
}

或者,如果您愿意放弃一些性能,则可以为事件创建完整的对象层次结构:

Alternatively, if you're open to giving up some performance, you can just create a complete object hierarchy for events:

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

And that way, if everything we put into epoll is an 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();
}

这篇关于如何在C ++中将回调函数指针传递给epoll_event结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆