Просто игнорируйте POLLHUP
в ответных флагах. Существующий код, если он правильный, будет делать то, что вы хотите.
Тот факт, что вы продолжите получать полузакрытия от poll()
(обрисовано в общих чертах в ответе EJP), является функцией, а не ошибкой. Это позволяет вам обращаться с полузакрытыми точно так же, как конец файла; это именно то, что вы хотите, так как оно позволяет вашему приложению читать последние байты в буфере сокета, а не отбрасывать их (что является правильной семантикой полузакрытия TCP).
Как только достигается "обычный" конец файла, poll()
всегда выбирает дескриптор файла как готовый для чтения. Затем предполагается, что цикл вокруг poll()
будет read()
данных до конца файла, а затем close()
. Игнорирование условия POLLHUP
позволяет вашей программе делать то же самое с тем же кодом в полузакрытых ситуациях и получать последние байты в буфере сокета.
Аналогично, вы должны реализовать поток управления, не заботясь о POLLHUP
. Если (и только если ) вам необходимо ограничить дескриптор файла (т. Е. В настоящее время некуда поместить байты read()
), то удалите этот дескриптор из набора poll()
, чтобы ядро не даст вам готовых к прочтению "прерываний", пока вы не скажете это снова (без регулирования). Тот факт, что все данные уже находятся в буфере сокета (что указывает бит POLLHUP
), снова не имеет значения.