Linux文件I/O高级操作:边缘触发与内存映射
1. 边缘触发与水平触发事件
1.1 触发模式定义
在事件通知机制中,有边缘触发(Edge-Triggered)和水平触发(Level-Triggered)两种模式。当传递给 epoll_ctl() 的事件参数的 events 字段中设置了 EPOLLET 值时,对文件描述符 fd 的监视就是边缘触发的,反之则是水平触发。
1.2 生产者 - 消费者示例
考虑一个生产者和消费者通过Unix管道进行通信的场景:
1. 生产者向管道写入1 KB的数据。
2. 消费者对管道执行 epoll_wait() ,等待管道中有数据可读。
在水平触发模式下,步骤2中的 epoll_wait() 调用会立即返回,表明管道已准备好读取。而在边缘触发模式下,该调用直到步骤1发生后才会返回。也就是说,即使在调用 epoll_wait() 时管道是可读的,调用也不会返回,直到有新数据写入管道。
1.3 两种模式对比
水平触发是默认行为,与 poll() 和 select() 的行为相同,也是大多数开发者所期望的。边缘触发行为需要不同的编程方法,通常会使用非阻塞I/O,并仔细检查 EAGAIN 错误。
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



