我需要捕获SIGABRT, SIGSEGV and SIGILL
,以便在我的控制失败并且程序需要退出时向用户显示正确的严重错误消息。
然而,我的程序会进行大量的实时计算,因此性能非常重要。
signal()
(http://www.cplusplus.com/reference/csignal/signal/)会导致任何performance loss
(某种常量监控?)或根本不会(仅在发生异常时触发,否则不会丢失性能)。< / p>
编辑:我的软件在Windows(7及更高版本)和OS X(10.7及更高版本)上运行。
答案 0 :(得分:8)
如果您的时间关键过程捕获信号,则没有“特殊”时间浪费。实际上,内核为您的进程保存了一个信号和动作表,如果发送了信号,它必须通过该表。但是,向进程发送消息或调用处理程序的每种方式都需要时间。消息队列或等待“标志”将具有几乎相同的“浪费”。
但是使用信号可能会有其他含义,应该提到。如果信号到达,几乎每个系统调用都可以被中断。来电的返回值为EINTR
。如果您传递给流程的信号很多,这可能会大大减慢您的应用程序速度,因为您必须经常检查EINTR
并重新进入系统调用。每个系统调用都有点贵。因此,使用EINTR
返回值循环系统调用可能是一个糟糕的设计。
但是对于您的问题,您只需查找SIGABRT
,SIGSEGV
和SIGILL
。这些信号通常仅用于很少的例外。所以不要害怕根据需要使用它们。但请避免频繁使用这些信号用于自己的IPC。这可以做到,但设计非常糟糕。对于用户IPC,有更好的信号名称和更好的方法。
简而言之:对于仅捕获异常信号,此处没有任何时间关键问题。