【问题标题】:Can SIGSEGV signal handler be called from the faulty thread instead of a separate thread?可以从故障线程而不是单独的线程调用 SIGSEGV 信号处理程序吗?
【发布时间】:2015-04-14 14:30:28
【问题描述】:

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

【问题讨论】:

  • 顺便问一下你用的是JNI吗?在那种情况下,我猜 Dalvik 可能有一个使用sigwait(3) 的信号处理线程。我相信我在下面所说的对于SIGSEGV 来说仍然是正确的。
  • @Ulfalizer:是的,JNI。

标签: android linux multithreading signals


【解决方案1】:

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

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

不过,也有线程导向的信号,保证在特定线程中处理。线程导向信号的示例包括为响应硬件异常而生成的信号,例如 SIGSEGVSIGBUSSIGILL 等,它们将在同一个线程中处理(意味着您无需特殊处理做!),以及使用pthread_kill(3) 发送到特定线程的信号。

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

【讨论】:

  • 我明白了......遗憾的是,SIGSEGV 最终也被单独的线程处理。有没有办法禁用这种行为?
  • 您如何确定它是在单独的线程中处理的?通过对两个线程的一些实验,其中一个sigwait()s 用于SIGSEGV 和另一个segfaults,SIGSEGV 信号处理程序在segfaults 线程中调用,而不是在sigwait()s 线程中调用,这就是我想要的也有预料。在不同的线程中处理SIGSEGV 之类的东西会很奇怪,因为无论如何都必须停止原始线程。
  • 我现在也尝试在出现段错误的线程中用pthread_sigmask() 阻塞SIGSEGV,但这只会导致进程立即终止而根本不调用信号处理程序。
  • 哇,这是新闻。没错,pthread_self() 匹配信号源和信号处理程序。
  • 好的,现在这对我来说完全没有意义。系统是否有可能为信号处理程序创建一个新堆栈,同时仍在同一个线程中运行它?因为堆栈是完全独立的,不包括故障站点(我指的是这里的调用堆栈)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
相关资源
最近更新 更多