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情况)