如何在多线程环境中捕获 SIGABRT?

How to catch SIGABRT in multithread environment?

我想创建一个单元测试框架,但为了提供良好的报告,我需要捕获 SIGABRT、SIGSEGV 和可能的其他信号以防止我的进程被终止(因此,能够继续测试处理)...

但我不知道该怎么做,所以我需要信息:

如果您有任何有用的文档、链接或教程,我很感兴趣。它适用于使用 pthreads 的 C 代码。

感谢您的帮助

I need to catch SIGABRT, SIGSEGV and probably others signals to prevent my process from being killed

这是徒劳的。在引发 SIGABRTSIGSEGV 之后,您(通常) 不知道 进程的状态——它可能损坏了堆、堆栈、全局测试框架内部的数据,C 运行时系统内部的全局数据,等等。继续这样的过程极有可能继续在代码中随机(正确)的地方崩溃。

只有在测试框架中处理这个问题的明智方法是fork并让进程处理子进程错误存在,报告它们并继续 运行 额外的测试。

SIGABRT is a thread direct signal ?

没有“直接信号”这样的东西。 SIGABRT可能是从进程外发给进程,也可能是进程内部raised。

What happens if I only use the main thread to catch the SIGABRT (or SIGSEGV) signal?

SIGSEGVSIGABRT(当不是从外部发送时)被发送到导致无效内存操作的线程(或 raised 它)。

此外,没有办法“仅使用主线程”——sigaction在所有线程中是全局的(尽管您可以设置线程特定的信号掩码)。