【发布时间】: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 运行它,看看信号处理程序是否正在改变。