关于epoll中event.data联合体的疑问解决方法
关于epoll中event.data联合体的疑问
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 */
};
为什么
epoll_data_t要被定义成union类型呢,是节省了空间,但是这样的设计使得fd和ptr用户数据字段不能共同使用了。
在epoll_wait返回时,data.fd字段存的是满足条件的描述符,肯定有用,但是ptr字段的值就无效了啊,大家都是怎么利用这个ptr字段的,我在为每个连接分配缓冲区时遇到这个问题,我想用这个指针把对应这个连接的buf地址传入,可是由于是union,就不行了。
------解决方案--------------------
用ptr指向你自己定义的结构不就可以了?有指针了不就什么都有了?
epoll_wait返回的是一个epoll_event的指针,所有有数据需要处理的数据都在里面了,自己写循环取就是了
------解决方案--------------------
epoll_data 其实就是自己的数据,直接的说就是一个8个字节的空间,你在注册之前把自己要在事件触发的时想的得到的数据写进去,比如socket句柄, 事件触发时,你就可以使用socket句柄读取数据了
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 */
};
为什么
epoll_data_t要被定义成union类型呢,是节省了空间,但是这样的设计使得fd和ptr用户数据字段不能共同使用了。
在epoll_wait返回时,data.fd字段存的是满足条件的描述符,肯定有用,但是ptr字段的值就无效了啊,大家都是怎么利用这个ptr字段的,我在为每个连接分配缓冲区时遇到这个问题,我想用这个指针把对应这个连接的buf地址传入,可是由于是union,就不行了。
------解决方案--------------------
用ptr指向你自己定义的结构不就可以了?有指针了不就什么都有了?
epoll_wait返回的是一个epoll_event的指针,所有有数据需要处理的数据都在里面了,自己写循环取就是了
------解决方案--------------------
epoll_data 其实就是自己的数据,直接的说就是一个8个字节的空间,你在注册之前把自己要在事件触发的时想的得到的数据写进去,比如socket句柄, 事件触发时,你就可以使用socket句柄读取数据了