问题描述:练习代码时,有这样一句代码 int32_t eventCount = epoll_wait(mPollFd, mEventData, MAX_EPOLL_SIZE, -1); 当作服务端,然后用一个客户端去连接,连接上后eventCount返回是正常的,为1,但在处理fd时,即打印有:
printf("fd = %d event happen!n", mEventData[i].data.fd); 打印出来的 fd一直是0,并不等于之前调用int32_t ret = epoll_ctl(mPollFd, EPOLL_CTL_ADD, eventHandle.mFd, &event);注册的fd,网上搜索半天没找到答案。最后才发现是自己疏忽了,没注意看结构体struct epoll_event 导致这个低级错误。
首先看struct epoll_event结构体:
typedef union epoll_data
{
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
注意:这是一个联合体。即只要赋值一个就可以了。
我的代码是这样的:
在给fd赋值后,又给u64赋0了,那这样fd在取值的时候也成了0。因为int32_t eventCount = epoll_wait(mPollFd, mEventData, MAX_EPOLL_SIZE, -1);返回的mEventData不会修改里面的fd,所以每次有读事件时,去取mEventData里的fd时一直是0。去掉event.data.u64 = 0;或是放到上一行前面都可以。
再编译跑起来,获取fd正常了。



