IT袋

当前位置:主页 > 经验教程 > 系统教程 >

Linux

Linux epoll详解(3)

时间:2024-01-09 15:58:59 来源:IT袋 作者:马勇
导读:Linux,服务器端每次只读取一个字符,由于注册了 EPOLLONESHOT 选项,第一次 EPOLLIN 事件触发后,服务器端再也不会触发 EPOLLIN,即使客户端再次发送“hello字符串。

Linux

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”字符串,执行效果如下:

Linux

这次可以正常收完整每次的数据包了。

在一些特殊应用场景中,如果涉及到多个线程同时处理某个 socket 上的事件,为了避免数据乱序,我们不得不使用复杂的多线程同步机制;但是有了 EPOLLONESHOT 选项,我们就可以减少线程同步逻辑了。

以 EPOLLIN 事件处理为例,多个线程同时从一个 socket 上读数据,可以使某个线程先处理,在该线程处理完了之后再重新给该 socket 添加读事件,这样读事件再次触发时,可以被其他线程继续处理。

这种做法的本质上还是保证同一个时刻只有一个线程在处理某个 socket 上的事件。

当然,多个线程同时操作一个 socket 本来就是一种不好的实践,读者在实际开发时应该尽量避免这种做法。

以上分享的Linux 及其 epoll详解的全面方法讲解,希望为您起一个抛砖引玉袋作用,能解决您生活中的问题吧。

相关阅读

  • win10一直转圈进不去系统 自己重启

    win10一直转圈进不去系统 自己重启

    一篇很详细的介绍是关于win10一直转圈进不去系统,自己重启的相关话题,很不错的经验小知识,建议收藏哦! 在使用Win10电脑时,你会发现因为各种原因无法正常进入系统的情况是非常常见的

  • win11开始菜单在左侧怎么办 win11开始菜单能不能靠左详情

    win11开始菜单在左侧怎么办 win11开始菜单能不能靠左详情

    今日小编为你讲解win11开始菜单能不能靠左详情的IT小经验,关于win11开始菜单在左侧怎么办 win11开始菜单能不能靠左详情,具体内容如下: win11系统的图片出现之后很多的用户都发现了这次新

  • mdf文件打开 mdf文件正由另一进程使用解决教程

    mdf文件打开 mdf文件正由另一进程使用解决教程

    小编为大家讲一讲mdf文件正由另一进程使用解决教程方面的知识,关于mdf文件正由另一进程使用解决教程,接下来一起来看看吧。 许多的小伙伴最近在使用电脑附加mdf数据时在选择mdf数据的时

  • win10开机卡在microsoft账户 重装电脑系统的详细步骤

    win10开机卡在microsoft账户 重装电脑系统的详细步骤

    小编为网友们解答win10开机卡在microsoft账户和重装电脑系统的详细步骤的话题,很不错的方法小知识,建议收藏哦! Windows上的开始菜单已经走了很长一段路。 从经典的一列到Windows 8的全屏显示