当EPOLLHUP看起来足够时,为什么我们需要EPOLLRDHUP?

xml*_*lmx 6 c linux networking epoll api-design

根据linux 手册页,

EPOLLHUP

从诸如管道或流套接字的通道读取时,此事件仅表示对等方关闭其通道的末尾.

EPOLLRDHUP

流套接字对等关闭连接,或关闭写入一半的连接.

我几乎无法区分EPOLLHUPEPOLLRDHUP.

对我来说,无论何时EPOLLRDHUP使用EPOLLHUP都可以使用相同的语义.

我对吗?如果没有,有什么解释吗?

Sam*_*ter 0

  • EPOLLHUP意味着对等方关闭了连接。对连接的写入被关闭,并且在消耗任何(可能的)可读数据之后,从连接的读取也被关闭。
  • EPOLLRDHUPonly 意味着对等方关闭了他们的连接,或者只关闭了一半的连接。如果它只是半关闭,流套接字就会变成单向、只写连接。写入连接可能仍处于打开状态,但在消耗任何(可能的)可读数据后,从连接读取数据将关闭。

shutdown()如果对等方调用其套接字描述符,不允许自己写入数据,则可以完成此操作:

#include <sys/socket.h>

int sockfd = /* ... */;
shutdown(sockfd, SHUT_WR);
Run Code Online (Sandbox Code Playgroud)