c sockets epoll

¿Cuál es el propósito de la opción disparada por el borde de epoll?



sockets (2)

De la página man de epoll:

epoll is a variant of poll(2) that can be used either as an edge-triggered or a level-triggered interface

¿Cuándo se usaría la opción disparada por el borde? La página man da un ejemplo que lo usa, pero no veo por qué es necesario en el ejemplo.


Cuando un FD se convierte en lectura o escritura listo, es posible que no necesariamente desee leer (o escribir) todos los datos de inmediato.

El epoll disparado por nivel seguirá molestándolo mientras el FD permanezca listo, mientras que el disparo por flanco no lo molestará nuevamente hasta la próxima vez que obtenga un EAGAIN (por lo que es más complicado codificar, pero puede ser más eficiente dependiendo de Qué necesitas hacer).

Digamos que estás escribiendo desde un recurso a un FD. Si registra su interés para que ese FD se convierta en listo para escritura como desencadenado por nivel, recibirá notificación constante de que el FD todavía está listo para la escritura. Si el recurso aún no está disponible, es un desperdicio de un despertar, porque de todos modos no puedes escribir más.

Si fuera a agregarlo como activado por flanco, recibiría una notificación que el FD estaba listo para escritura una vez, luego cuando el otro recurso esté listo, escriba lo más que pueda. Luego, si write(2) devuelve EAGAIN , deja de escribir y espera la próxima notificación.

Lo mismo se aplica para la lectura, porque es posible que no desee extraer todos los datos en el espacio del usuario antes de que esté listo para hacer lo que quiera con él (por lo tanto, tener que almacenarlo en el búfer, etc., etc.). Con epoll desencadenado por flancos, se le informa cuando está listo para leer, y luego puede recordar eso y hacer la lectura real "como y cuando".


En mis experimentos, ET no garantiza que solo se despierte un hilo, aunque a menudo solo despierta uno. La bandera de EPOLLONESHOT es para este propósito.