Lorsqu'un FD devient prêt à être lu ou écrit, vous ne souhaitez pas nécessairement lire (ou écrire) toutes les données immédiatement.
L'époll déclenché par le niveau continuera à vous harceler tant que le FD reste prêt, tandis que l'époll déclenché par le bord ne vous dérangera plus jusqu'à la prochaine fois que vous obtiendrez un EAGAIN
(il est donc plus compliqué de coder autour, mais peut être plus efficace en fonction de ce que vous devez faire).
Disons que vous écrivez d'une ressource vers un FD. Si vous enregistrez votre intérêt pour que ce FD devienne prêt à l'écriture comme déclenché par un niveau, vous recevrez une notification constante que le FD est toujours prêt à l'écriture. Si la ressource n'est pas encore disponible, c'est un gaspillage de réveil, car vous ne pouvez plus écrire de toute façon.
Si vous l'ajoutez plutôt en tant que déclencheur par le bord, vous recevrez une notification indiquant que le FD est prêt à l'écriture une fois, puis lorsque l'autre ressource devient prête, vous écrirez autant que vous le pouvez. Ensuite, si write(2)
renvoie à EAGAIN
vous arrêtez d'écrire et attendez la prochaine notification.
La même chose s'applique à la lecture, parce que vous ne voudrez peut-être pas transférer toutes les données dans l'espace utilisateur avant d'être prêt à faire ce que vous voulez en faire (et donc de devoir les mettre en mémoire tampon, etc etc). Avec l'epoll déclenché par le bord, on vous dit quand vous êtes prêt à lire, et vous pouvez vous en souvenir et faire la lecture proprement dite "comme et quand".