关于epoll中event.data联合体的疑问

活宝 2012-01-07 03:53:01
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,就不行了。
...全文
441 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
活宝 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 nice_cxf 的回复:]

用ptr指向你自己定义的结构不就可以了?有指针了不就什么都有了?
epoll_wait返回的是一个epoll_event的指针,所有有数据需要处理的数据都在里面了,自己写循环取就是了
[/Quote]

确实是啊,有ptr就不用愁别的了
活宝 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lanneret1234 的回复:]

epoll_data 其实就是自己的数据,直接的说就是一个8个字节的空间,你在注册之前把自己要在事件触发的时想的得到的数据写进去,比如socket句柄, 事件触发时,你就可以使用socket句柄读取数据了
[/Quote]

理解了~~谢谢~
lanneret1234 2012-01-09
  • 打赏
  • 举报
回复
epoll_data 其实就是自己的数据,直接的说就是一个8个字节的空间,你在注册之前把自己要在事件触发的时想的得到的数据写进去,比如socket句柄, 事件触发时,你就可以使用socket句柄读取数据了
nice_cxf 2012-01-09
  • 打赏
  • 举报
回复
用ptr指向你自己定义的结构不就可以了?有指针了不就什么都有了?
epoll_wait返回的是一个epoll_event的指针,所有有数据需要处理的数据都在里面了,自己写循环取就是了
活宝 2012-01-09
  • 打赏
  • 举报
回复
给自己顶下,继续等待回答~
活宝 2012-01-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yarpee 的回复:]

既然是union那么同一时刻肯定只有一个成员变量有效的,但也有32bit分high 16bit和low 16bit的时候。
[/Quote]

那如果没有fd字段的话,我怎么又能知道应该从哪个套接字的buf读取数据呢?不能同时使用,那设计者还设计这个字段干嘛?仅用ptr字段有如何作用呢
yarpee 2012-01-07
  • 打赏
  • 举报
回复
既然是union那么同一时刻肯定只有一个成员变量有效的,但也有32bit分high 16bit和low 16bit的时候。
黯然 2012-01-07
  • 打赏
  • 举报
回复
这个union占8个字节

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧