Подтвердить что ты не робот

Какова цель запуска с помощью epoll edge?

Из страницы epoll man:

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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