是否有任何TCP设置会影响SIGPIPE?

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

要回复问题请先登录注册