相关知识点简介: epoll有两个模式可以设置,一个是水平模式(level-triggered),另一个是边缘模式(edge-triggered), 区别就是水平模式可以带来事件的重复触发,而边缘模式只触发一次。举个栗子,当epoll监听的描述符发生可读事件时,比方说收到了别人发来的10个字节数据,你只读了一个字节,如果是水平触发,那么epoll将一直触发直到剩下那9个字节读完,而边缘触发呢,就是收到了一个读事件,你自己去读吧,读多少算多少,而epolll只触发一次。

而我在实际测试epoll监听udp套接字的时候,使用默认的水平触发去监听读事件,每次只读取一个字节,按道理收到多个字节epoll应该触发(trigger)多次才对,结果它只触发了一次,如图:

程序启动后监听3500端口,使用网络调试助手发3个字节到监听地址,只读取一个,结果显示epoll触发一次后就hang住

代码这样写的:

    while(1) {
        fds = epoll_wait(efd, epoll_events_ptr, 2, -1); //阻塞
        for (i = 0; i<fds; i++)
            if (epoll_events_ptr[i].events & EPOLLIN)
                ret = read(fd1, buffer, 1);
                if(ret != -1)
                    log("recv msg : %s \n", buffer);
            memset(buffer, 0, BUFFER_SIZE);

同样情况下,如果监听的是标准输入的话,epoll触发了多次,如下图,代码就不贴了

两个例子流程基本一样,除了一个监听udp套接字,一个监听标准输入(STDIN_FILENO)

最后在stackoverflow上有大神解答说UDP套接字是以报文为单位的,如果一次没有读取完成,剩余数据会被丢弃,这解释了为什么epoll只触发了一次,因为在读取一个字节的时候,剩余两个字节被丢弃了。这和面向字节流的TCP套接字不同。

stackoverflow上的问题链接

https://stackoverflow.com/questions/50938689/epoll-eventsepolllt-only-triggered-once-on-udp-socket/50939267#50939267

创建了一个linux应用&内核相关开发到讨论群:745510310 欢迎有兴趣的同学加入关于epoll 水平触发在udp套接字上不生效问题的原因_linux_03

python散点图拟合椭圆 python matplotlib散点图

前言上篇文章介绍了使用matplotlib绘制折线图,参考:https://www.jb51.net/article/198991.htm,本篇文章继续介绍使用matplotlib绘制散点图。一、matplotlib绘制散点图# coding=utf-8 import matplotlib.pyplot as plt years = [2009, 2010, 2011, 2012, 2013, 2

Android16位颜色代码 安卓开发颜色代码

在Android应用开发中经常要用各种控件,并为控件设置其背景颜色,使用各种不同的颜色为控件着色是很有必要的。  在Android系统中,各种颜色与其对应的码制如下所示:<resources> <color name="white">#ffffff</color><!--白色 --> <color name="ivory">#ffff

1.Cryptanalysis of a Code-Based Signature Scheme Based on the Schnorr-Lyubashevsky Framework 2.微信小程序 video 9:16播放视频动态显示:objectFit属性值 非全屏cover全屏fill 3.Esxi 扩容Ubuntu失败 提示“设备“3”的操作无效” 4.2023年9月12日 5.shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得命令帮助 内部命令help 命令的“--help” 选项 使用man命令阅读手册页 命令行编辑的几个辅助