POLLHUP против POLLRDHUP? - PullRequest
       20

POLLHUP против POLLRDHUP?

1 голос
/ 17 мая 2019

Согласно справочной странице , функция poll может возвращать события POLLHUP и POLLRDHUP.Насколько я понимаю, только POLLHUP является POSIX-совместимым, а POLLRDHUP является нестандартным расширением Linux.Однако оба, похоже, сигнализируют о том, что конец записи соединения закрыт, поэтому я не понимаю добавленной стоимости POLLRDHUP по сравнению с POLLHUP.Кто-нибудь, пожалуйста, объясните разницу между ними?

1 Ответ

0 голосов
/ 19 мая 2019

Нет, когда 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.

...