【问题标题】:Linux SIGPIPE Crashing ServerLinux SIGPIPE 崩溃服务器
【发布时间】:2012-10-15 03:36:13
【问题描述】:

所以在我的应用程序开始时我调用

signal(SIGPIPE, SIG_IGN);

我认为我的应用程序会忽略 SIGPIPE。但是我仍然使用以下代码导致 SIGPIPE 崩溃:

write(fd, outgoingStr->c_str(), size);

其中 fd 是一个 int(文件描述符),而 size 是字符串的大小。我在这里做错了什么?

顺便说一句,我最近使用将该写入包装在 if 中以检查返回的错误值,并且我相信在删除该错误值之前我从未遇到过 SIGPIPE 崩溃。如果出现错误,if 检查除了 cout 到控制台什么也没做,所以我不确定它是否相关。

【问题讨论】:

  • 您确定要获得 SIGPIPE?例如。你有什么证据表明这是一个信号,而不是其他错误?
  • 您确定您以前的包装器除了写入控制台之外什么也没做,例如也退出什么的?您应该在写入时获得 EPIPE。
  • gdb 告诉我这是 SIGPIPE,并指出 write 调用是问题所在。旧包装器没有退出,因为我的程序应该忽略在断开连接的套接字上写入。这当然很难测试,因为 SIGPIPE 错误仅在客户端无法正常退出时随机发生。
  • 您应该在写入时检查 EPIPE,关闭套接字并执行除此之外的任何适当操作。在关闭与服务器的连接之前,编写一个失败或死亡的测试客户端应该不难。
  • 这似乎不太可能,但可能某些库函数正在将 SIGPIPE 恢复到 DIG_DFL。用 strace 运行它,看看信号处理程序是否正在改变。

标签: linux sigpipe


【解决方案1】:

问题最终是 GDB 将在 SIGPIPE 上停止,即使它被忽略。正常运行应用程序时,它会按预期工作。

【讨论】:

    猜你喜欢
    • 2011-12-10
    • 2011-08-08
    • 2016-06-12
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多