epoll_data 结构体问题

在学习epoll时,发现epoll_event结构体中的epoll_data使用了union,导致自定义指针ptr的赋值出现问题。由于union各成员共享内存,对其中一个成员的修改会影响到其他成员,这解释了为何read返回-1。测试代码验证了这一现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习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是各项共用一段内存,所以后面改动了前面也会跟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值