Читаю 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 (а не просто запись была прервана).