【问题标题】:General signal question with regards to expected behavior关于预期行为的一般信号问题
【发布时间】:2021-05-05 14:14:47
【问题描述】:

场景 1

假设存在以下场景。

我的程序调用了一个 3rd 方库,该库又调用了另一个 3rd 方库,该库转身并进行操作系统调用。

   MyProgram
        |
   some3rdPartyFunction() ---> 3rd party library
                                 |
                             another3rdPartyFunction()----> another 3rd party library
                                                                      |
                                                                    OS call()

第一组问题:

  • 如果此 OS 调用对已关闭的套接字进行套接字调用,会发生什么情况?
  • 是否向进行 OS 调用的进程返回错误?
  • 系统在什么时候返回 SIGPIPE 消息?
  • SIGPIPE 是只发送到调用函数还是 SIGPIPE 会一直传播到 MyProgram?

场景 2

我碰巧看到一个进程的线程转储的以下输出。

rt_sigprocmask(SIG_SETMASK, ...)
rt_sigreturn({mask=[PIPE]})
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigaction(SIGINT, [], [], 8) = 0
rt_sigaction(SIGTERM, [], [], 8) = 0
rt_sigaction(SIGHUP, [], [], 8) = 0
rt_sigaction(SIGABRT, [], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], [], 8) = 0
rt_sigreturn({mask=[PIPE]})

第二组问题:

  • 为什么要发送这么多信号消息?
  • 这些是直接发送到 MyProgram 还是被传播 从较低的操作系统调用开始?
  • 随着发送的信号种类繁多,如何确定哪个是 究竟是什么原因造成的?

【问题讨论】:

    标签: linux signals sigpipe


    【解决方案1】:

    如果此 OS 调用对已关闭的套接字进行套接字调用,会发生什么?

    好吧,在谈论文件描述符(可能已关闭)和流套接字(如 TCP,可能部分或完全关闭)时,“关闭”可能会有点误导。我认为您要问的是write() call error,POSIX 记录为:

    [EPIPE] 尝试在已关闭以进行写入或不再连接的套接字上进行写入。在后一种情况下,如果套接字是 SOCK_STREAM 类型,则还应向线程发送 SIGPIPE 信号。

    是否向进行操作系统调用的进程返回错误?

    错误将返回到名为write 的任何代码位,并为最终调用write线程 生成信号。

    系统在什么时候返回 SIGPIPE 消息?

    在尝试写入不可写的套接字或管道时会生成 SIGPIPE。

    SIGPIPE 是只发送到调用函数还是一直传播到 MyProgram?

    SIGPIPE 是为调用线程生成的。它在调用链中的位置——你的程序、第 3 方库等——与信号传递无关。

    为什么要发送这么多信号消息?

    您所显示的内容均未发送。这些电话中的大多数都是关于屏蔽和信号处理,不是信号生成。 rt_sigreturn 电话告诉你Linux is handling the delivery of a SIGPIPE

    这些是直接发送到 MyProgram 还是从较低的操作系统调用向上传播?

    我不明白这是什么意思。 SIGPIPE 是为您进程中的特定线程生成的,无论您在 MyProgram 中的代码是否知道该线程的存在,或者第 3 方库是否“秘密”创建了该线程。

    随着发送的信号种类繁多,如何确定究竟是哪一个导致了问题?

    在您展示的内容中只生成一个信号,那就是 SIGPIPE。

    【讨论】:

    • 感谢您的回复。我将不得不阅读它几次并进一步研究以完全理解。
    猜你喜欢
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多