可以从错误的线程而不是单独的线程调用SIGSEGV信号处理程序吗?

时间:2015-04-14 14:30:28

标签: android linux multithreading signals

在Android上(我也假设在通用Linux上),在单独的线程中调用一个带有sigaction的信号处理函数(可能专门用于信号处理)。有没有办法注册处理程序回调,以便它在触发信号的同一个线程中执行?

1 个答案:

答案 0 :(得分:3)

在通用Linux上,默认情况下,信号处理程序在单独的线程中调用。 (我怀疑它在Android上是一样的,但我还没有调查它。)要在一个单独的线程中处理信号,你必须从你想要的某个线程显式调用sigwait(3)处理信号。这是一种常见的设置。

相反,默认行为(对于过程导向信号)是选择现有线程"随机"处理输入信号。 (当然,它可能有一些一致性,但这是一个实现细节。)

但是,还有线程导向的信号,这些信号保证在特定线程中处理。线程导向信号的示例包括响应硬件异常而生成的信号,如SIGSEGVSIGBUSSIGILL等,它们将在同一线程中处理(含义你需要做什么特别的事情!),以及用pthread_kill(3)发送到特定线程的信号。

signal(7)手册页(注意节号)是一个很好的参考。