默认情况下epol1提供的是水平触发通知。这表示epol1 会告诉我们何时能在文件描述符上以非阻塞的方式执行I/O 操作。这同po11()和select ()所提供的通知类型相同。
epoll API还能以边缘触发方式进行通知---也就是说, 会告诉我们自从上一次调用epo11_ wait ()以来文件描述符上是否已经有I/0 活动了(或者由于描述符被打开.了,如果之前没有调用的话)。使用epo11的边缘触发通知在语义上类似于信号驱动I/O,只是如果有多个I/0事件发生的话,epoll 会将它们合并成一-次单独的通知,通过epo11_ wait()返回,而在信号驱动I/0中则可能会产生多个信号。要使用边缘触发通知,我们在调用epo11_ ct1()时在ev. events字段中指定EPOLLET标志。

我们通过一个例子来说明epoll 的水平触发和边缘触发通知之间的区别。假设我们使用epoll 来监视一个套接字上的输入(EPOLLIN) ,接下来会发生如下的事件。
1.套接字上有输入到来。
2.我们调用一-次epoll wait()。无论我们采用的是水平触发还是边缘触发通知,该调用都会告诉我们套接字已经处于就绪态了。
3.再次调用epo11_ wait()。
如果我们采用的是水平触发通知,那么第二个epoll_ wait (调用将告诉我们套接字处于就绪态。而如果我们采用边缘触发通知,那么第二个epoll wait()调用将阻

epoll是一个高效的I/O事件通知机制,支持水平触发和边缘触发两种模式。水平触发通知会在文件描述符可读写时通知,而边缘触发则只在有新I/O活动时通知,常与非阻塞I/O配合使用。在边缘触发中,为避免数据丢失,需要在接收到通知后尽可能执行I/O操作,且通常文件描述符应设置为非阻塞模式。
最低0.47元/天 解锁文章
3万+

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



