0

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

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

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

4

1 回答 1

3

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

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

于 2012-10-09T16:07:52.127 回答