2015-02-11 87 views
0

我一直在寻找this question的答案,我在Linux中遇到了函数timerfd_createepoll。在教程中有人说,epoll_ctl()有一个epoll_data_t联合成员的epoll_event结构,它可以用来执行callback函数的事件触发。但我不确定如何去做。任何人都可以请帮忙。如何将回调函数指针传递给C++中的epoll_event结构

+0

你的意思是'epoll_wait'超时,或者你有一个'timerfd'触发? – Barry 2015-02-11 04:38:14

+0

我有一个timerfd创建一个计时器,并且这个计时器到期。 – Jackzz 2015-02-11 04:40:10

回答

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); 

这样,如果的一切都是我们放入epollEventHandler

int n = epoll_wait (epollfd, events , num_events, -1); 
for (int i = 0; i < n; ++i) { 
    static_cast<EventHandler*>(events[i].data.ptr)->fire(); 
} 
+0

它不是一个epoll超时。 – Jackzz 2015-02-11 04:41:15

+0

我想创建一个定时器,它在超时时应该执行一个函数。我想作为回调函数来执行这个函数。 – Jackzz 2015-02-11 04:42:38

+0

感谢您的帮助。但是,你能举一个最简单的工作例子吗?直到现在我还没有使用过这些功能,并且有点困惑。对不起,如果这种需要是无用的.. – Jackzz 2015-02-11 04:53:55