程序如何处理多个线程和信号的中断?
How does a program handle an interruption with several threads and signals?
假设我有一个程序,其主函数创建了多个线程。在每个线程中,我通过 signal(SIGINT, functionA)
将 CTRL + C
中断(SIGINT
)重定向到 functionA
,在主进程中,我将相同的中断重定向到 functionB
( signal(SIGINT, functionB
).
当程序运行发送中断SIGINT
时,程序会做什么?
它将在所有线程中执行 functionA
然后在主进程中执行 functionB
?
信号处理程序操作(SIG_IGN、SIG_DFL 或处理函数)是每个进程 属性,而不是每个线程 属性。
这意味着如果说不同的线程使用sigaction()设置相同的信号动作,那么最新的一个获胜。
此外,如果您有多个不阻塞信号的线程,内核只需选择一个(基本上是随机的)用于传递信号。即只传递一次,不是每个线程传递一次。
假设我有一个程序,其主函数创建了多个线程。在每个线程中,我通过 signal(SIGINT, functionA)
将 CTRL + C
中断(SIGINT
)重定向到 functionA
,在主进程中,我将相同的中断重定向到 functionB
( signal(SIGINT, functionB
).
当程序运行发送中断SIGINT
时,程序会做什么?
它将在所有线程中执行 functionA
然后在主进程中执行 functionB
?
信号处理程序操作(SIG_IGN、SIG_DFL 或处理函数)是每个进程 属性,而不是每个线程 属性。
这意味着如果说不同的线程使用sigaction()设置相同的信号动作,那么最新的一个获胜。
此外,如果您有多个不阻塞信号的线程,内核只需选择一个(基本上是随机的)用于传递信号。即只传递一次,不是每个线程传递一次。