- 条件触发: 只要输入缓冲有数据就会一直通知该事件
边缘触发: 输入缓冲收到数据时仅注册1次该事件,即使输入缓冲中还留有数据,也不会再进行注册
水平触发(
level-triggered
,也被称为条件触发):只要满足条件,就触发一个事件(只要有数据没有被获取,内核就不断通知你)- 边缘触发(
edge-triggered
): 每当状态变化时,触发一个事件
举个读socket
的例子,假定经过长时间的沉默后,现在来了100个字节,这时无论边缘触发和条件触发都会产生一个read ready notification
通知应用程序可读。应用程序读了50个字节,然后重新调用api
等待io
事件。
这时条件触发的api
会因为还有50个字节可读从而立即返回用户一个read ready notification
。而边缘触发的api
会因为可读这个状态没有发生变化而陷入长期等待。
因此在使用边缘触发的api
时,要注意每次都要读到socket
返回EWOULDBLOCK
为止,否则这个socket
就算废了。而使用条件触发的api
时,如果应用程序不需要写就不要关注socket
可写的事件,否则就会无限次的立即返回一个write ready notification
。大家常用的select
就