这个名听起来挺唬人,其实就是利用struct epoll_event这个数据类型里data中的void* ptr而已。由于data是一个共用体可以将我们之前使用的fd换成ptr使用,由于ptr是一个泛型指针,可以指向任意的数据类型。我们可以自己写一个结构体包含文件描述符,关心的事件类型,函数指针等,用函数指针指向一个函数,这样我们就把文件描述符和想做的操作捆绑到了一起。并且用ptr指向这个结构体,当有事件返回时,我们不需要关心它的事件是什么可以直接调用ptr指向的函数指针完成处理。
struct epoll_event数据类型如下:
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
struct epoll_event {
uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
相关代码可以去看一下libevent库中的代码。