Linux epoll详解(3)
Linux

服务器端每次只读取一个字符,由于注册了EPOLLONESHOT选项,第一次 EPOLLIN 事件触发后,服务器端再也不会触发 EPOLLIN,即使客户端再次发送“hello”字符串。
将上面的代码稍微修改一下,在读取一个字符成功后,我们再次给这个 clientfd 注册 EPOLLIN 事件,在原代码 176 行之后添加如下代码:
//添加在原代码 176 行之后
epoll_event client_fd_event;
client_fd_event.data.fd = epoll_events[i].data.fd;
client_fd_event.events = EPOLLIN;
//在这里再次为clientfd再次注册EPOLLIN事件
if (epoll_ctl(epollfd, EPOLL_CTL_MOD, epoll_events[i].data.fd, &client_fd_event) != -1)
{
std::cout << "rearm EPOLLIN event to clientfd: " << epoll_events[i].data.fd << std::endl;
}
else
{
//epoll_ctl调用失败从epollfd移除clientfd,并关闭clientfd
if (epoll_ctl(epollfd, EPOLL_CTL_DEL, epoll_events[i].data.fd, NULL) != -1)
{
std::cout << "remove clientfd from epoll fd successfully, clientfd:" << epoll_events[i].data.fd << std::endl;
}
close(epoll_events[i].data.fd);
}
重新编译程序并执行,客户端再次发送两个“hello”字符串,执行效果如下:

这次可以正常收完整每次的数据包了。
在一些特殊应用场景中,如果涉及到多个线程同时处理某个 socket 上的事件,为了避免数据乱序,我们不得不使用复杂的多线程同步机制;但是有了 EPOLLONESHOT 选项,我们就可以减少线程同步逻辑了。
以 EPOLLIN 事件处理为例,多个线程同时从一个 socket 上读数据,可以使某个线程先处理,在该线程处理完了之后再重新给该 socket 添加读事件,这样读事件再次触发时,可以被其他线程继续处理。
这种做法的本质上还是保证同一个时刻只有一个线程在处理某个 socket 上的事件。
当然,多个线程同时操作一个 socket 本来就是一种不好的实践,读者在实际开发时应该尽量避免这种做法。
以上分享的Linux 及其 epoll详解的全面方法讲解,希望为您起一个抛砖引玉袋作用,能解决您生活中的问题吧。
相关阅读
-
win10一直转圈进不去系统 自己重启
一篇很详细的介绍是关于win10一直转圈进不去系统,自己重启的相关话题,很不错的经验小知识,建议收藏哦! 在使用Win10电脑时,你会发现因为各种原因无法正常进入系统的情况是非常常见的
-
win11开始菜单在左侧怎么办 win11开始菜单能不能靠左详情
今日小编为你讲解win11开始菜单能不能靠左详情的IT小经验,关于win11开始菜单在左侧怎么办 win11开始菜单能不能靠左详情,具体内容如下: win11系统的图片出现之后很多的用户都发现了这次新
-
mdf文件打开 mdf文件正由另一进程使用解决教程
小编为大家讲一讲mdf文件正由另一进程使用解决教程方面的知识,关于mdf文件正由另一进程使用解决教程,接下来一起来看看吧。 许多的小伙伴最近在使用电脑附加mdf数据时在选择mdf数据的时
-
win10开机卡在microsoft账户 重装电脑系统的详细步骤
小编为网友们解答win10开机卡在microsoft账户和重装电脑系统的详细步骤的话题,很不错的方法小知识,建议收藏哦! Windows上的开始菜单已经走了很长一段路。 从经典的一列到Windows 8的全屏显示


