当前位置:嗨网首页>书籍在线阅读

08-边缘触发事件和条件触发事件

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

4.2.4 边缘触发事件和条件触发事件

如果epoll_ctl()的参数event中的events项设置为EPOLLET,fd上的监听方式为边缘触发(Edge-triggered),否则为条件触发(Level-triggered)。

考虑下面的生产者和消费者在通过UNIX管道通信时的情况。

1.生产者向管道写入1KB数据。

2.消费者在管道上调用epoll_wait(),等待管道上有数据并可读。

通过条件触发监视时,在步骤2中epoll_wait()调用会立即返回,表示管道可读。通过边缘触发监视时,需要步骤1发生后,步骤2中的epoll_wait()调用才会返回。也就是说,对于边缘触发,在调用epoll_wait()时,即使管道已经可读,也只有当有数据写入之后,调用才会返回。

条件触发是默认行为,poll()和select()就是采用这种模式,也是大多数开发者所期望的。边缘触发需要不同的编程解决方案,通常是使用非阻塞I/O,而且需要仔细检查EAGAIN。

边缘触发 “边缘触发”这个术语源于电子工程领域。条件触发是只要有状态发生就触发。边缘触发是只有在状态改变的时候才会发生。条件触发关心的是事件状态,边缘触发关心的是事件本身。 举个例子,对于一个读操作的文件描述符,如果是条件触发,只要文件描述符可读了,就会收到通知,是“可读”这个条件触发了通知。如果是边缘触发,当数据可读时,会接收到通知,而且通知有且仅有一次:是“有数据”这个变化本身触发了通知。