学习epoll使用的过程中,了解到epoll_data中有一个指针ptr可供自定义使用,结构定义如下:
typedef union epoll_data
{
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
epoll_event结构体定义如下:
struct epoll_event
{
uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
} __EPOLL_PACKED;
于是我做了如下操作:
struct myevent_s {
int fd;
int events;
void *arg;
void (*call_back)(int fd, int events, void *arg);
int status;
char buf[256];
int len;
long last_active;
};
struct epoll_event ev = {0};
struct epoll *evptr;
ev.events = EPOLLIN; //监听定时器读事件,当定时器超时时,定时器描述符可读。
ev.data.fd = efd;//efd是我创建的一个对象标识符
ev.data.ptr=&g_event;
//....
//....epoll操作,此处略去
ret = read(evptr->data.fd, &value, sizeof(uint64_t));
然而总是报错,read返回-1。单步调试后发现在给ev.data.xxx赋值时,之前赋的值总会变化。仔细看了定义后才看到,data是个union, 不是struct。union是各项共用一段内存,所以后面改动了前面也会跟