如果Unix(Posix)进程接收到信号,则将运行信号处理程序。
在多线程进程中会发生什么?哪个线程接收信号?
我认为,应该扩展信号API来处理该问题(即应该能够确定信号处理程序的线程),但是在网上寻找信息时,我只在Linux内核邮件列表中发现了长达一年之久的信息。不同的论坛。据我了解,Linus的概念不同于Posix标准,并且首先构建了一个兼容层,但现在Linux遵循posix模型。
目前的状态是什么?
如果Unix(Posix)进程接收到信号,则将运行信号处理程序。
在多线程进程中会发生什么?哪个线程接收信号?
我认为,应该扩展信号API来处理该问题(即应该能够确定信号处理程序的线程),但是在网上寻找信息时,我只在Linux内核邮件列表中发现了长达一年之久的信息。不同的论坛。据我了解,Linus的概念不同于Posix标准,并且首先构建了一个兼容层,但现在Linux遵循posix模型。
目前的状态是什么?
Answers:
POSIX中有关“ 理论:系统接口常规信息”中“ 信号生成和传递 ” 的条目说
为一个进程生成的信号仅传递到一个线程。因此,如果有多个线程有资格接收信号,则必须选择一个线程。线程的选择完全取决于实现,既可以允许最大范围的一致性实现,又可以使实现自由地将信号传递到“最容易的”线程,前提是不同线程之间的传递便利性有所不同。
从signal(7)
Linux系统上的手册中:
信号可能会针对整个过程(例如,当使用
kill(2)
进行发送时)或特定线程(例如,由于执行特定机器而产生的某些信号,例如SIGSEGV和SIGFPE )而产生(并因此待处理)语言指令是面向线程的,使用来针对特定线程的信号也是如此pthread_kill(3)
。可以将过程控制信号传递到当前未阻塞信号的任何一个线程。如果多个线程中的信号畅通无阻,则内核选择一个任意线程来将信号传递到该线程。
线程具有不同的备用信号堆栈设置。但是,新线程的备用信号堆栈设置是从创建它的线程中复制的,因此这些线程最初共享一个备用信号堆栈(在内核2.6.16中已修复)。
从pthreads(3)
OpenBSD系统的手册中(作为替代方法的示例):
信号处理程序通常在当前正在执行的线程的堆栈上运行。
(我目前不知道在多处理器计算机上同时执行多个线程时如何处理)
POSIX线程的较早LinuxThread实现仅允许信号定位不同的单个线程。从pthreads(7)
Linux系统上:
LinuxThreads不支持过程控制信号的概念:信号只能发送到特定线程。