如果多线程Linux进程收到信号,该怎么办?


20

如果Unix(Posix)进程接收到信号,则将运行信号处理程序。

在多线程进程中会发生什么?哪个线程接收信号?

我认为,应该扩展信号API来处理该问题(即应该能够确定信号处理程序的线程),但是在网上寻找信息时,我只在Linux内核邮件列表中发现了长达一年之久的信息。不同的论坛。据我了解,Linus的概念不同于Posix标准,并且首先构建了一个兼容层,但现在Linux遵循posix模型。

目前的状态是什么?


3
重复的stackoverflow.com/questions/11679568/… “ pthreads(7)描述POSIX.1要求进程中的所有线程共享属性,包括信号处理”
Steve

@steve谢谢,但是1)它在另一个SE网站上2)此规范未明确说明,将会发生什么。这意味着,将在所有线程上调用信号处理程序,但对我来说似乎有点超现实。3)该答案并未说明Linus的模型是什么,以及为什么/目前如何使用它。
彼得-恢复莫妮卡2015年

Answers:


9

POSIX中有关“ 理论:系统接口常规信息”中“ 信号生成和传递 ” 的条目说

为一个进程生成的信号仅传递到一个线程。因此,如果有多个线程有资格接收信号,则必须选择一个线程。线程的选择完全取决于实现,既可以允许最大范围的一致性实现,又可以使实现自由地将信号传递到“最容易的”线程,前提是不同线程之间的传递便利性有所不同。

signal(7)Linux系统上的手册中:

信号可能会针对整个过程(例如,当使用kill(2)进行发送时)或特定线程(例如,由于执行特定机器而产生的某些信号,例如SIGSEGV和SIGFPE )而产生(并因此待处理)语言指令是面向线程的,使用来针对特定线程的信号也是如此pthread_kill(3)。可以将过程控制信号传递到当前未阻塞信号的任何一个线程。如果多个线程中的信号畅通无阻,则内核选择一个任意线程来将信号传递到该线程。

pthreads(7)

线程具有不同的备用信号堆栈设置。但是,新线程的备用信号堆栈设置是从创建它的线程中复制的,因此这些线程最初共享一个备用信号堆栈(在内核2.6.16中已修复)。

pthreads(3)OpenBSD系统的手册中(作为替代方法的示例):

信号处理程序通常在当前正在执行的线程的堆栈上运行。

(我目前不知道在多处理器计算机上同时执行多个线程时如何处理)

POSIX线程的较早LinuxThread实现仅允许信号定位不同的单个线程。从pthreads(7)Linux系统上:

LinuxThreads不支持过程控制信号的概念:信号只能发送到特定线程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.