Зачем нам EPOLLRDHUP, когда EPOLLHUP кажется достаточно?
Согласно справочной странице Linux,
EPOLLHUP
При чтении из канала, такого как канал или сокет потока, это событие просто указывает, что узел закрыл свой конец канала.
EPOLLRDHUP
Потоковое сокет однорангового соединения закрыто или завершено запись половины соединения.
Я не могу сказать, какая разница между EPOLLHUP
а также EPOLLRDHUP
,
Для меня всякий раз, когда EPOLLRDHUP
используется EPOLLHUP
можно использовать вместо этого с той же семантикой.
Я прав? Если нет, какие-либо объяснения?
1 ответ
-
EPOLLHUP
означает, что одноранговый узел закрыл свой конец соединения. Запись в соединение закрывается , и после того, как любые (возможные) читаемые данные потребляются, чтение из соединения также закрывается. -
EDPOLLRDHUP
означает только то, что одноранговый узел закрыл свое соединение или только половину своего соединения. Если он закрыт только наполовину, потоковый сокет превращается в одностороннее соединение только для записи. Запись в соединение все еще может быть открыта , но после того, как любые (возможные) читаемые данные будут израсходованы, чтение из соединения будет закрыто.
Это может быть сделано, если одноранговый узел вызывает
shutdown()
на свой дескриптор сокета, запрещая себе запись данных:
#include <sys/socket.h>
int sockfd = /* ... */;
shutdown(sockfd, SHUT_WR);