问题:对epoll_event结构成员data.ptr赋值引发的问题(已解决)
在写一个socket程序时候, 希望实现 fd 与 类对象的相互绑定。这样每次fd有读写事件到时候都能够使用同一个对象处理。简单的说,就是每个fd对应到一个连接用户。
我的做法很普通,调用epoll_ctl函数时对epoll_event的data.ptr赋值成对象指针就可以了(实际上我看别人的代码也是那么做的)。当然,我也有注意到data成员是联合体,所以我只是给data.ptr赋值,并没有网上所说data.ptr与data.fd都赋值造成值覆盖的情况。
int event_add(int epollfd, int fd, unsigned int events, void *data) { struct epoll_event ev; ev.data.ptr = data; ev.events = events; return epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev); }
// 调用
Task *newtask = new Task();
event_add(epfd, sockfd, EPOLLIN | EPOLLET, static_cast<void *>(newtask));
按理说,这样写之后期望的结果应该在epoll_wait返回之后,可以通过event[i].data.ptr能够获取到绑定对象,继续处理逻辑。
while (true)
{ int nready = epoll_wait(epollfd, clients, MAXEVENTSIZE, -1); for (int i = 0; i < nready; i++) { int fd = clients[i].data.fd; if ((fd == listenfd) && (clients[i].events & EPOLLIN)) do_accept(epollfd, listenfd); else if (clients[i].events & EPOLLIN) {
cout << "epoll_wait fd ---> " << fd << endl;
Task *t = (Task *)clients[i].data.ptr; // 获取绑定对象
t->exec();
}
}
}
但是结果就很奇怪,在上面代码cout处,终端得到的结果一直是一串特别长的数值。断点查看新连接socket得到fd的值, 没有问题,正常传值。这个问题先留着。。。暂时没定位到问题。。。
!!!clients[i].data.fd这里错了, 因为就没对它赋值, 应该通过Task *task = clients[i].data.ptr,task->getFd();获取!!!太傻了。。。