Какова цель опции, запускаемой по краю epoll? - PullRequest
52 голосов
/ 06 февраля 2012

Со страницы руководства epoll:

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

Когда можно использовать опцию запуска по краю?Страница man дает пример, который использует его, но я не понимаю, почему это необходимо в этом примере.

Ответы [ 2 ]

96 голосов
/ 06 февраля 2012

Когда FD становится готовым к чтению или записи, вы, возможно, не захотите сразу читать (или записывать) все данные.

Эполл, вызванный уровнем, будет вас мучить, пока FD остается готовым,тогда как инициируемый фронтом не будет беспокоить вас снова, пока в следующий раз вы не получите EAGAIN (поэтому его сложнее кодировать, но он может быть более эффективным в зависимости от того, что вам нужно сделать).

СкажитеВы пишете из ресурса в FD.Если вы зарегистрируете свою заинтересованность в том, чтобы этот FD стал готовым к записи по мере срабатывания уровня, вы получите постоянное уведомление о том, что FD все еще готов к записи.Если ресурс еще не доступен, это пустая трата пробуждения, потому что вы все равно больше не можете писать.

Если бы вы добавили его как инициируемый фронтом, вы бы получилиуведомление о том, что FD был готов для записи один раз, затем, когда другой ресурс становится готовым, вы пишете столько, сколько можете.Затем, если write(2) возвращает EAGAIN, вы прекращаете запись и ждете следующего уведомления.

То же самое относится и к чтению, поскольку вы можете не захотеть вытягивать все данные в пространство пользователя до того, как выготов делать все, что вы хотите с ним делать (таким образом, нужно его буферизовать и т. д.)С запущенным по краю epoll вы узнаете, когда он будет готов к чтению, а затем сможете запомнить это и выполнить фактическое чтение «как и когда».

8 голосов
/ 27 февраля 2014

В моих экспериментах ET не гарантирует, что проснется только один поток, хотя часто он просыпается только один. Для этого используется флаг EPOLLONESHOT.

...