LINUX.ORG.RU

Условие окончание чтения при epoll ET

 


0

2

Читаю man epoll. При работе в рекомендованном режиме EPOLLET при получении события EPOLLIN рекомендуется читать до получения EAGAIN/EWOULDBLOCK. Но в то же время «For stream-oriented files» указано, что можно закончить читать, когда получено данных меньше запрошенного. В то же время man read говорит, что чтение может вернуть меньше данных, если вызов был прерван сигналом (т.е. насколько я понимаю, вернется данных меньше, чем возможно, а не ошибка EAGAIN).

Вот тут у меня возник вопрос, все-таки возможно при чтении из tcp сокета получить данных меньше, чем доступно в буфере. Т.е возможна ли, например, такая ситуация, что в буфере 10К данных, я запросил 8К, мне скопировали 4, а вторая страница пользовательского буфера оказалась в swap, в результате ядро решило завершить read этими 4-мя K данными. Или, например, во время копирования данных в пользовательский буфер пришел сигнал (будет ли откат чтения с возвратом ошибки EINTR или после обработки сигнала копирование будет завершено).

В общем вопрос нужно ли в режиме EPOLLET читать из tcp сокета до получения EAGAIN/EWOULDBLOCK или можно остановиться, когда данных будет прочитано меньше запрошенного (т.е. никакое событие не может привести к чтению меньшего количества данных, чем лежит в буфере ядра, точнее, что очередной epoll_wait вернет событие EPOLLIN для этого файлового дескриптора, при наличии там данных).

И такой же вопрос для записи. Если записано данных меньше, чем запрошено, то есть ли гарантия, что очередной epoll_wait вернет EPOLLOUT (а не просто запись была прервана).

Ответ на: комментарий от gh0stwizard

Списибо за ссылку. Почитал, непонятно, как вообще с epoll что-то работает, если верить автору. А он, насколько я понимаю, очень хорошо разбирается в теме и не страдает Windows-центризмом характерным авторам boost::asio.

traffic
() автор топика
Ответ на: комментарий от traffic

непонятно, как вообще с epoll что-то работает

Марк, как и другие программисты, любит эмоционально в красках все расписывать. В данном случае, он емко и кратко объяснил все известные ему косяки. Это не значит, что так работает везде. Ядро и libc постоянно развиваются, вносятся изменения и улучшения, поэтому с годами ситуация только улучшается. Тем не менее, всегда остаются системы, где нет возможности произвести обновление [до момента Х].

Поэтому, все, что ты прочитал к тому, что если что-то в твоем случае будет не получаться, работать странно и т.п. нужно просто удостовериться, что система у тебя свежая, и быть готовым [эмоционально] к такому поведению.

gh0stwizard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.