我一直在寻找this question的答案,我在Linux中遇到了函数timerfd_create
和epoll
。在教程中有人说,epoll_ctl()
有一个epoll_data_t
联合成员的epoll_event
结构,它可以用来执行callback
函数的事件触发。但我不确定如何去做。任何人都可以请帮忙。如何将回调函数指针传递给C++中的epoll_event结构
0
A
回答
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. 将任意结构指针的数组传递给C函数?
- 2. 错误时,将指针传递给结构函数c
- 3. 将结构指针传递给函数c
- 4. 将函数结构的指针传递给另一个函数
- 5. 将结构指针传递给ctypes中的函数
- 6. 将指针传递给函数C++ SDL2
- 7. C - 传递结构指针VS函数的整数指针
- 8. 将函数指针传递给构造函数C++
- 9. 将值指针传递给c函数中的指针值
- 10. 如何将结构传递给回调函数作为参数
- 11. 将结构指针传递给C中的函数以解引用数组
- 12. 如何将指针传递给Cython中的c函数?
- 13. C++将指针传递给函数(Howto)+ C++指针操作
- 14. 将函数指针传递给函数
- 15. 结构中的指针传递给CUDA
- 16. 将大结构指针传递给函数缓存有效吗?
- 17. C++将结构传递给函数
- 18. 将NSTextField指针传递给IOUSBInterfaceInterface182回调
- 19. 如何将函数指针从C#传递给C++ Dll?
- 20. 如何将函数指针传递给函数内的函数
- 21. C++将父指针传递给父类构造函数
- 22. 如何将指针传递给构造函数?
- 23. 如何将指针和指针传递给函数?
- 24. c指向指针或将函数传递给函数的指针
- 25. 将函数引用传递给C指针类型,C将调用函数
- 26. 如何将结构向量传递给C++中的函数?
- 27. 将参数传递给函数指针
- 28. 将指针数组传递给函数
- 29. 将C#中的字符指针传递给C++函数
- 30. LLVM:将指向包含指向函数的指针的结构的指针传递给JIT函数
你的意思是'epoll_wait'超时,或者你有一个'timerfd'触发? – Barry 2015-02-11 04:38:14
我有一个timerfd创建一个计时器,并且这个计时器到期。 – Jackzz 2015-02-11 04:40:10