我遇到信号处理程序处理SIGABRT信号的问题。处理SIGABRT时,信号处理程序无法计划出来。所以其他线程在有人收到SIGABRT后无法运行。这会导致程序不正确的崩溃。但是,在处理SIGSEGV时,它已正确安排并且其他线程能够运行。
收到信号后,我将一些恢复机制发布到另一个线程。对于sigsegv来说,它正在被执行,对于SIGABRT而言,并不是因为线程本身没有被调度。
仅供参考:我正在使用基于优先级的RR调度来处理我的进程> 150个线程。
答案 0 :(得分:3)
无法阻止ABRT信号。你可以安装一个处理程序,但是hander不能返回(即它必须终止进程,通常是通过调用std::exit
或_Exit
)。如果确实返回,则会再次引发信号并安装默认处理程序(终止程序)。
相比之下,SEGV是一个普通的信号,你可以捕获,处理和阻止,但由于你无法修复典型SEGV的潜在原因,你无法真正从中理智地恢复。但是在此期间你仍然可以执行大量代码。