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

Posted

技术标签:

【中文标题】是否有任何 TCP 设置会影响 SIGPIPE?【英文标题】:Does any of the TCP Settings impact SIGPIPE? 【发布时间】:2011-01-20 06:16:55 【问题描述】:

我在两个系统上测试了相同的测试代码(服务器 - 客户端)。在一个我得到一个 SIGPIPE,在另一个我没有得到 SIGPIPE。

测试场景如下:

客户

    连接到服务器 从服务器接收数据 发送数据 关闭套接字

服务器

    接受来自服务器的连接 向客户端发送数据 接收数据 发送数据 关闭套接字

在一个系统中(客户端和服务器在同一系统上运行),SIGPIPE 随机发生在客户端或服务器端。

但是,在另一个系统中,同样的测试代码不会出现这个问题。

我想知道管道损坏是否与 TCP 设置有关。

【问题讨论】:

【参考方案1】:

您也可以忽略来自套接字的 SIGPIPE,以防止应用程序崩溃:

int set = 1;
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));

其中 sd 是您接收 SIGPIPE 的套接字。

【讨论】:

您也可以将sendtoMSG_NOSIGNAL 标志一起使用,它是无状态的。【参考方案2】:

如果您尝试写入另一端已经关闭的套接字,则会引发SIGPIPE 信号。这里有一个竞争条件,如果一端在另一端尝试发送数据的同时关闭套接字 - 可能在发送之前或之后收到关闭通知,这就是为什么 SIGPIPE 在一个测试中发生环境而不是其他。

通常,套接字感知应用程序应忽略SIGPIPE,而是同步处理来自send()EPIPE 错误。

【讨论】:

以上是关于是否有任何 TCP 设置会影响 SIGPIPE?的主要内容,如果未能解决你的问题,请参考以下文章

SIGPIPE

SIGPIPE信号解析

调试 X11 程序时如何避免 SIGPIPE(由于超时?)?

关于SIGPIPE导致的程序退出

Linux网络编程-SIGPIPE信号导致的程序退出问题

SIGPIPE 如何影响命名管道中的作者?