本文主要是介绍epoll_wait 返回的fd总是0,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题描述:练习代码时,有这样一句代码 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正常了。
这篇关于epoll_wait 返回的fd总是0的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!