epoll_wait 中带有管道的 EPOLLERR 的含义
meaning of EPOLLERR from epoll_wait with a pipe
这与问题 1 类似,但与管道有关。如果 epoll_wait returns EPOLLERR 用于管道的写入端,我如何区分一般错误情况和管道的读取端已关闭?对于套接字情况,答案是使用 "use getsockopt and SO_ERROR to get the pending error" 并将其与 EPIPE 进行比较。但是我应该为管道使用什么 API 作为 pipe(2) 在 Linux 上创建的管道或通过打开命名管道返回的管道不是套接字?
除了另一端被关闭外,管道的写端没有任何可以被epoll检测到的错误。实际调用 write() 时可能出现的少数错误无法事先知道(例如,如果您传递了无效的缓冲区指针),因此 epoll 无法检测到它们。因此,如果 epoll 告诉你有错误,那就是 EPIPE。
(好的,实际上还有另一种可能的错误情况,但它只能由编程错误触发:如果您关闭文件描述符然后在列表中使用 epoll_wait - 我不知道不知道 epoll 对此会有何反应)。
这与问题 1 类似,但与管道有关。如果 epoll_wait returns EPOLLERR 用于管道的写入端,我如何区分一般错误情况和管道的读取端已关闭?对于套接字情况,答案是使用 "use getsockopt and SO_ERROR to get the pending error" 并将其与 EPIPE 进行比较。但是我应该为管道使用什么 API 作为 pipe(2) 在 Linux 上创建的管道或通过打开命名管道返回的管道不是套接字?
除了另一端被关闭外,管道的写端没有任何可以被epoll检测到的错误。实际调用 write() 时可能出现的少数错误无法事先知道(例如,如果您传递了无效的缓冲区指针),因此 epoll 无法检测到它们。因此,如果 epoll 告诉你有错误,那就是 EPIPE。
(好的,实际上还有另一种可能的错误情况,但它只能由编程错误触发:如果您关闭文件描述符然后在列表中使用 epoll_wait - 我不知道不知道 epoll 对此会有何反应)。