【问题标题】:Process hungs with SIGABRT signal handler使用 SIGABRT 信号处理程序挂起的进程
【发布时间】:2012-10-09 16:02:31
【问题描述】:

我在处理 SIGABRT 信号的信号处理程序方面遇到问题。在处理 SIGABRT 时,信号处理程序无法调度。因此,在有人收到 SIGABRT 后,其他线程无法运行。这会导致程序不正常的崩溃。但是,在处理 SIGSEGV 时,它被正确调度并且其他线程能够运行。

收到信号后,我将一些恢复机制发布到另一个线程。对于 sigsegv 它正在执行,对于 SIGABRT 它不是因为线程本身没有被调度。

仅供参考:我正在为拥有> 150个线程的进程使用基于优先级的RR调度。

【问题讨论】:

  • 你无法处理真相。对不起,我的意思是 SIGABRT。您无法处理 SIGABRT。
  • ^^^ - @KerrekSB 很有趣 :)

标签: c++ linux linux-kernel scheduling


【解决方案1】:

无法阻止 ABRT 信号。您可以安装处理程序,但处理程序不得返回(即它必须终止进程,通常通过调用std::exit_Exit)。如果它确实返回,则将再次引发信号并安装默认处理程序(这会终止您的程序)。

相比之下,SEGV 是一个普通的信号,您可以捕获、处理和阻止,但由于您无法修复典型 SEGV 的根本原因,因此您无法真正从它中恢复。但同时您仍然可以执行大量代码。

【讨论】:

  • @tuban:请记住,信号处理程序可能只包含异步安全代码,这不是很多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2015-01-05
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多