对linux 多路复用Epoll模型的水平出发模式和边缘触发模式的理解

本文详细解析了Linux epoll模型中的水平触发通知和边沿触发通知两种模式的区别,包括它们的工作原理、如何设置以及注意事项。特别强调了在非阻塞文件描述符上的I/O操作和事件触发的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

水平触发通知又叫“低速模式”,是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);

      或者一步到位的方式:
     fcntl(socket,F_SETFL,fcntl(socket,F_GETFL)|O_NONBLOCK);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值