Sockets libuv如何在对等端重置连接时忽略SIGPIPE(linux)

Sockets libuv如何在对等端重置连接时忽略SIGPIPE(linux),sockets,libuv,Sockets,Libuv,当对等方重置连接时,我从uv\u write()接收到一个SIGPIPE p/x stream->flags 0x46064 ./src/unix/internal.h:# define UV__POLLRDHUP 0x2000 对于BSD,防止SIGPIPElibuv有: ./src/unix/core.c #if defined(SO_NOSIGPIPE) { int on = 1; setsockopt(sockfd, SOL_SOCKET, SO_NOSIG

当对等方重置连接时,我从
uv\u write()
接收到一个
SIGPIPE

p/x stream->flags
0x46064

./src/unix/internal.h:# define UV__POLLRDHUP 0x2000
对于BSD,防止SIGPIPElibuv有:

./src/unix/core.c

#if defined(SO_NOSIGPIPE)
 {
    int on = 1;
    setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &on, sizeof(on));
 }
#endif

Linux没有
SO\u NOSIGPIPE
作为选项。任何关于如何为linux处理
SIGPIPE
信号的建议,而不是
signal(SIGPIPE,SIG_-IGN)

您必须更新
uv\u write()
才能使用
MSG\u NOSIGNAL
标志调用:

如果面向流的套接字上的对等方已关闭连接,则不要生成
SIGPIPE
信号。仍然返回
eppe
错误。这提供了与使用忽略
SIGPIPE
类似的行为,但是,鉴于
MSG_NOSIGNAL
是每次调用的功能,忽略
SIGPIPE
会设置影响进程中所有线程的进程属性


对您的问题的简短回答是:不,任何处理
SIGPIPE
的方法都可以,但需要设置一个信号处理程序

有关
SO_NOSIGPIPE
libuv
的讨论,请参阅。它还澄清了为什么存在BSD的代码。

根据:libuv不使用MSG_NOSIGNAL的原因是sendmsg()是一个比write()更昂贵的系统调用。[…]
信号(信号管,信号灯)是最简单的解决方案,IMHO。(在系统调用失败时,您必须处理errno==eppe情况)