首页 未命名正文

linux编程_对Linux 多路复用Epoll模子的水平出发模式和边缘触发模式的明白

云返利网 未命名 2020-05-26 09:07:56 15 0

水平触发通知又叫“低速模式”,是linux epoll模子的默认方式。对于此方式《Linux/Unix系统编程手册(下册)》中的注释是:若是文件描述符上可以非壅闭地执行I/O系统挪用,此时以为它已经停当。

对此,我的明白是:某个I/O实践停当,例如,文件缓冲区收到了5个字节的数据,此时此文件描述符可读,触发epoll可读事宜。然则若是停当的文件描述符是非壅闭的(也就是说中途可以被打断),当读取三个字节的时刻被其余事宜打断了,下次仍然触发此描述符的可读事宜,会接着读上次没读完的两个字节。

边缘触发通知又叫”高速模式“(ET),书上的注释是:若是文件描述符自上次状态检查以来有了新的I/O流动(好比新的输入),此时需要触发通知。

我的明白是:拿可读事宜来说,若是文件缓冲区收到了5个字节的数据,触发通知,最先读取缓冲区数据,若是此文件描述符仍然是非壅闭的,被其余信号打断后,未来得及读取的数据将丢失,只有下次再有新的数据加入缓冲区后,再次触发通知,读取新的数据。因此使用"ET模式"时需要尽可能多的读取或者写入数据。

设置EPOLL 为ET 模式的方式:

 struct epoll_event ev;
 ev.data.fd = fd;
 ev.events = EPOLLIN | EPOLLET;
 epoll_ctl(epoll_fd,EPOLL_ZTL_ADD,fd, &ev);
设置文件为非壅闭模式的方式:

主要使用如下两个函数获取文件的flags,即open函数的第二个参数:
    flags = fcntl(fd,F_GETFL,0);
设置文件的flags:
    fcntl(fd,F_SETFL,flags);

设置方式
      flags = fcntl(fd,F_GETFL,0);   
      flags |= O_NONBLOCK;     
      fcntl(fd,F_SETFL,flags);

【关于云返利网】

云返利网是阿里云、腾讯云、华为云产品推广返利平台,在各个品牌云产品官网优惠活动之外,云返利网还提供返利。您可以无门槛获得阿里云、华为云、腾讯云所有产品返利,在官网下单后就可以领取,无论是自己用、公司用还是帮客户采购,您个人都可以获得返利。云返利网的目标是让返利更多、更快、更简单!详情咨询13121395187(微信同号)