首先我们以 Tencent/libco 的使用样例 example_echosvr.cpp 为例,阐述我的疑惑,是真的搞不懂了,真心希望得到帮助.
int fd = co_accept(g_listen_fd, (struct sockaddr *)&addr, &len); // accept
if (fd < 0)
{
printf(" co_accept() fd < 0 \n");
struct pollfd pf = {0};
pf.fd = g_listen_fd;
pf.events = (POLLIN | POLLERR | POLLHUP);
co_poll(co_get_epoll_ct(), &pf, 1, 1000);
continue;
}
co_poll->co_poll_inner函数将g_listen_fd注册进epoll,然后给他设置了一个定时器,然后切换出 CPU,(在这里将data.ptr指针指向一个结构,该结构中包含当前协程的指针.那这样当g_listen_fd上有连接到来时,epoll就可以通过data.ptr 指针直接唤醒对应的accept_routine 协程即可,唤醒后处在co_poll_inner函数中,
但是这时 Libco 删除了g_listen_fd和其所对应的定时器,然后回到上面函数accept即可.这看起来并没有什么不对之处.但是我想了一下,那这样的花,每次都要进过这个过程不是很麻烦吗?
实在是理解不了他那里为什么要把 fd 删除的原因????????