为什么bash在进程死后不打印“Broken pipe”日志?

问题描述:

我的客户端会循环发送包到服务器。客户端程序不会捕获SIGPIPE。 (客户端操作系统是Ubuntu服务器12.04 LTS)为什么bash在进程死后不打印“Broken pipe”日志?

我做如下测试:

  1. 3次握手后结束。然后客户端会发送一些包到服务器。 服务器可以正常接收包。

  2. 然后我突然杀死了服务器进程。

  3. 客户端进程已死亡。但我没有看到任何日志节目“断管”。

我认为bash会报告死因。

为什么bash在进程死后不打印“Broken pipe”日志?

但我开始使用gdb的过程,重复上面的步骤。进程死了,gdb显示如下日志:

“程序接收到的信号SIGPIPE,坏道”。

如果客户端没有捕获到SIGPIPE,那么它不可能打印出错信息!接收到SIGPIPE的程序打印出“写入错误”或作为对信号的响应的格式为“Broken pipe”的消息。由于您的客户端不处理SIGPIPE,因此它不会打印该错误消息,而只是终止。当你在gdb中运行时,gdb告诉你,子进程因SIGPIPE而终止。

+0

您的分析是正确的,谢谢! – tihuBird

+0

也许分析是正确的,但措辞很差。我无法想象一个过程实际上对此SIGPIPE响应此错误消息。更典型的是忽略SIGPIPE并在写入失败后报告错误。总是检查写入的返回值! –