Linux 关于预期行为的一般信号问题

Linux 关于预期行为的一般信号问题,linux,signals,sigpipe,Linux,Signals,Sigpipe,情景1 假设存在以下场景 我的程序调用第三方库,第三方库反过来调用另一个第三方库,第三方库反过来调用操作系统 MyProgram | some3rdPartyFunction() ---> 3rd party library | another3rdPartyFunction()----> another 3rd party libr

情景1

假设存在以下场景

我的程序调用第三方库,第三方库反过来调用另一个第三方库,第三方库反过来调用操作系统

   MyProgram
        |
   some3rdPartyFunction() ---> 3rd party library
                                 |
                             another3rdPartyFunction()----> another 3rd party library
                                                                      |
                                                                    OS call()
第一组问题:

  • 如果此操作系统调用对关闭的套接字进行套接字调用,会发生什么
  • 是否向进行操作系统调用的进程返回了错误
  • 系统在什么时候返回SIGPPIPE消息
  • 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还是正在传播 从较低的操作系统调用向上
  • 由于发送的信号种类繁多,如何确定哪一个是 究竟是什么导致了这个问题
如果此操作系统调用对关闭的套接字进行套接字调用,会发生什么

当谈到文件描述符(可能是关闭的)和流套接字(比如TCP,可能是部分或完全关闭的)时,“closed”可能有点误导。我想您要问的是一个POSIX文档:

[EPIPE]尝试对已关闭进行写入或不再连接的套接字进行写入。在后一种情况下,如果插座为SOCK_STREAM类型,则还应向螺纹发送SIGPIPE信号

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

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

系统在什么时候返回SIGPPIPE消息

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

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

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

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

你所展示的东西没有被发送。大多数调用都是关于屏蔽和信号处理,而不是信号生成。
rt\u sigreurn
调用告诉您这一点

这些是直接发送到MyProgram还是从较低的OS调用向上传播

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

随着各种各样的信号被发送,如何确定哪一个是真正导致问题的原因

在你展示的东西中只有一个信号产生,那就是信号管

如果此操作系统调用对关闭的套接字进行套接字调用,会发生什么

当谈到文件描述符(可能是关闭的)和流套接字(比如TCP,可能是部分或完全关闭的)时,“closed”可能有点误导。我想您要问的是一个POSIX文档:

[EPIPE]尝试对已关闭进行写入或不再连接的套接字进行写入。在后一种情况下,如果插座为SOCK_STREAM类型,则还应向螺纹发送SIGPIPE信号

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

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

系统在什么时候返回SIGPPIPE消息

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

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

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

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

你所展示的东西没有被发送。大多数调用都是关于屏蔽和信号处理,而不是信号生成。
rt\u sigreurn
调用告诉您这一点

这些是直接发送到MyProgram还是从较低的OS调用向上传播

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

随着各种各样的信号被发送,如何确定哪一个是真正导致问题的原因


您显示的内容中只生成了一个信号,那就是信号管。

谢谢您的回复。我要把它通读几遍,进一步研究才能完全理解。谢谢你的回复。我将不得不把它通读几遍,并进一步研究以完全理解它。