Нет, когда poll()
в сокете, POLLHUP
будет сигнализировать, что соединение было закрыто в обоих направлениях.
POLLRDHUP
будет установлено, когда другой конец вызвал shutdown(SHUT_WR)
или когда этот конец вызвал shutdown(SHUT_RD)
, но соединение все еще может быть живым в другом направлении.
Вы можете взглянуть на net/ipv4/tcp.c
источник ядра:
if (sk->sk_shutdown == SHUTDOWN_MASK || state == TCP_CLOSE)
mask |= EPOLLHUP;
if (sk->sk_shutdown & RCV_SHUTDOWN)
mask |= EPOLLIN | EPOLLRDNORM | EPOLLRDHUP;
SHUTDOWN_MASK
- это RCV_SHUTDOWN|SEND_SHUTDOWN
. RCV_SHUTDOWN
устанавливается, когда принимается пакет FIN
, а SEND_SHUTDOWN
устанавливается, когда пакет FIN
подтверждается другим концом, а сокет переходит в состояние FIN-WAIT2
.
[кроме части TCP_CLOSE
, этот фрагмент реплицируется всеми протоколами; и все это работает аналогично для сокетов Unix и т. д.]
Есть и другие важные отличия - POLLRDHUP
(в отличие от POLLHUP
) должен быть явно установлен в .events
, чтобы быть возвращенным в .revents
.
И POLLRDHUP
работает только на сокетах, а не на fifos / pipe или ttys.