我在两个系统上测试了相同的测试代码(服务器 - 客户端)。在一个我得到一个SIGPIPE,在另一个我没有得到SIGPIPE。
测试场景如下所示:
在一个系统(在同一系统上运行的客户端和服务器)中,SIGPIPE在客户端或服务器端随机发生。
但是,在另一个系统中,使用相同的测试代码不会发生此问题。
我想知道破坏的管道是否与TCP设置有关。
答案 0 :(得分:1)
如果您尝试写入另一端已关闭的套接字,则会引发SIGPIPE
信号。这里有一个竞争条件,如果一端在另一端尝试发送数据的同时关闭套接字 - 可能在发送之前或之后收到关闭通知,这就是SIGPIPE
发生的原因。一个测试环境,而不是另一个。
通常,套接字感知应用程序应忽略SIGPIPE
,而是从EPIPE
同步处理生成的send()
错误。
答案 1 :(得分:1)
您还可以忽略来自套接字的SIGPIPE,以防止此代码导致应用程序崩溃:
int set = 1;
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));
其中sd是您接收SIGPIPE的套接字。