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

时间:2011-01-20 06:16:56

标签: c linux sigpipe

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

测试场景如下所示:

客户端

  1. 连接到服务器
  2. 从服务器接收数据
  3. 发送数据
  4. 关闭套接字
  5. 服务器

    1. 接受来自服务器的连接
    2. 向客户发送数据
    3. 接收数据
    4. 发送数据
    5. 关闭套接字
    6. 在一个系统(在同一系统上运行的客户端和服务器)中,SIGPIPE在客户端或服务器端随机发生。

      但是,在另一个系统中,使用相同的测试代码不会发生此问题。

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

2 个答案:

答案 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的套接字。