【问题标题】:Why the bash doesn't print the "Broken pipe" log after process dead?为什么bash在进程死后不打印“Broken pipe”日志?
【发布时间】:2012-11-16 01:28:27
【问题描述】:

我的客户端将循环发送包到服务器。客户端程序不捕获 SIGPIPE。 (客户端操作系统是ubuntu server 12.04 LTS)

我做了以下测试:

  1. 3 次握手完成后。然后客户端将一些包发送到服务器。 服务器可以正常接收包裹。

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

  3. 客户端进程已死。但我没有看到任何日志显示“Broken pipe”。

我认为 bash 会报告死因。

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

但我使用 gdb 启动该过程,重复上面的步骤。进程死了,gdb显示以下日志:

“程序收到信号 SIGPIPE,管道损坏。”

【问题讨论】:

    标签: c++ c linux bash ubuntu


    【解决方案1】:

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

    【讨论】:

    • 或许分析正确,但措辞不佳。我无法想象一个进程实际上使用此错误消息响应 SIGPIPE。比较典型的是忽略SIGPIPE,写入失败后报错。始终检查写入的返回值!
    猜你喜欢
    • 2014-11-10
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2016-12-18
    • 2020-12-05
    • 2022-10-31
    相关资源
    最近更新 更多