关于预期行为的一般信号问题
General signal question with regards to expected behavior
场景一
假设存在以下情况。
我的程序调用第 3 方库,后者又调用另一个第 3 方库,后者转身并进行 OS 次调用。
MyProgram
|
some3rdPartyFunction() ---> 3rd party library
|
another3rdPartyFunction()----> another 3rd party library
|
OS call()
第一组问题:
- 如果此 OS 调用对已关闭的套接字进行套接字调用,会发生什么情况?
- 进行 OS 调用的进程是否 return 出错?
- 系统什么时候 return SIGPIPE 消息?
- SIGPIPE 是只发送到调用函数还是
SIGPIPE 一直传播到 MyProgram?
场景二
我碰巧看到一个进程的线程转储的以下输出。
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 还是被传播
从较低的 OS 调用?
- 随着发送的信号种类繁多,如何确定哪一个是
真正导致问题?
If this OS calls makes a socket call to a closed socket, what happens?
嗯,在谈论文件描述符(可能已关闭)和流套接字(如 TCP,可能部分或完全关闭)时,“关闭”可能有点误导。我想你问的是 write()
call error POSIX 记录为:
[EPIPE] 尝试在已关闭或不再连接的套接字上进行写入。在后一种情况下,如果套接字类型为 SOCK_STREAM,SIGPIPE 信号也应发送到线程。
Is an error returned to the process making the OS call?
错误返回到调用 write
的任何代码位,并为最终调用 write
的 线程 生成信号。
At what point does the system return a SIGPIPE message?
当试图写入不可写的套接字或管道时生成 SIGPIPE。
Does the SIGPIPE only get sent to the calling function or does the SIGPIPE get propagated all the way up to MyProgram?
SIGPIPE 是为调用线程 生成的。它在其调用链中的位置——您的程序、第 3 方库等——与信号传递无关。
Why are so many signal messages being sent?
None 正在按您显示的内容发送。这些电话中的大多数是关于屏蔽和信号处理的,不是信号生成。 rt_sigreturn
调用告诉你 Linux is handling the delivery of a SIGPIPE.
Would these be getting sent directly to MyProgram or being propagated up from the lower OS call?
我不明白这是什么意思。 SIGPIPE 是为您进程中的特定线程生成的,无论您在 MyProgram 中的代码是否知道该线程的存在,或者第 3 方库是否“秘密”创建了该线程。
With the variety of signals being sent, how to determine which one is actually causing the problem?
您显示的内容中只生成了一个信号,那就是 SIGPIPE。
场景一
假设存在以下情况。
我的程序调用第 3 方库,后者又调用另一个第 3 方库,后者转身并进行 OS 次调用。
MyProgram
|
some3rdPartyFunction() ---> 3rd party library
|
another3rdPartyFunction()----> another 3rd party library
|
OS call()
第一组问题:
- 如果此 OS 调用对已关闭的套接字进行套接字调用,会发生什么情况?
- 进行 OS 调用的进程是否 return 出错?
- 系统什么时候 return SIGPIPE 消息?
- SIGPIPE 是只发送到调用函数还是 SIGPIPE 一直传播到 MyProgram?
场景二
我碰巧看到一个进程的线程转储的以下输出。
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 还是被传播 从较低的 OS 调用?
- 随着发送的信号种类繁多,如何确定哪一个是 真正导致问题?
If this OS calls makes a socket call to a closed socket, what happens?
嗯,在谈论文件描述符(可能已关闭)和流套接字(如 TCP,可能部分或完全关闭)时,“关闭”可能有点误导。我想你问的是 write()
call error POSIX 记录为:
[EPIPE] 尝试在已关闭或不再连接的套接字上进行写入。在后一种情况下,如果套接字类型为 SOCK_STREAM,SIGPIPE 信号也应发送到线程。
Is an error returned to the process making the OS call?
错误返回到调用 write
的任何代码位,并为最终调用 write
的 线程 生成信号。
At what point does the system return a SIGPIPE message?
当试图写入不可写的套接字或管道时生成 SIGPIPE。
Does the SIGPIPE only get sent to the calling function or does the SIGPIPE get propagated all the way up to MyProgram?
SIGPIPE 是为调用线程 生成的。它在其调用链中的位置——您的程序、第 3 方库等——与信号传递无关。
Why are so many signal messages being sent?
None 正在按您显示的内容发送。这些电话中的大多数是关于屏蔽和信号处理的,不是信号生成。 rt_sigreturn
调用告诉你 Linux is handling the delivery of a SIGPIPE.
Would these be getting sent directly to MyProgram or being propagated up from the lower OS call?
我不明白这是什么意思。 SIGPIPE 是为您进程中的特定线程生成的,无论您在 MyProgram 中的代码是否知道该线程的存在,或者第 3 方库是否“秘密”创建了该线程。
With the variety of signals being sent, how to determine which one is actually causing the problem?
您显示的内容中只生成了一个信号,那就是 SIGPIPE。