Ответ 1
Когда FD становится готовым к чтению или записи, вам может не потребоваться немедленное чтение (или запись) всех данных.
Эпоха, запускаемая с помощью уровня, будет продолжать питать вас до тех пор, пока FD останется готовым, в то время как скремблированный фронт не будет беспокоить вас снова до следующего раза, когда вы получите EAGAIN
(так что сложнее скомпоновать код, но может быть более эффективными в зависимости от того, что вам нужно делать).
Скажите, что вы пишете ресурс в FD. Если вы зарегистрируете свою заинтересованность в том, что этот FD станет готовым к записи, как вызванный уровнем, вы получите постоянное уведомление о том, что FD все еще готов к написанию. Если ресурс еще не доступен, это пустая трата времени, потому что вы больше не можете писать.
Если бы вы добавили его как связанное с краем, вы получите уведомление о том, что FD был готов к записи один раз, а затем, когда другой ресурс будет готов, вы пишете столько, сколько сможете. Затем, если write(2)
возвращает EAGAIN
, вы прекратите запись и дождитесь следующего уведомления.
То же самое относится и к чтению, потому что вы можете не захотеть вытащить все данные в пространство пользователя, прежде чем вы будете готовы делать все, что хотите с ним (таким образом, чтобы его буферировать и т.д. и т.д.). С появлением эпохи эпохи, которую вы узнаете, когда она готова к чтению, а затем помните об этом и выполняйте фактическое чтение "как и когда".