当我无法控制的某项失败并且程序需要退出时,我需要捕获SIGABRT, SIGSEGV and SIGILL才能向用户显示正确的严重错误消息。

但是我的程序进行了大量的实时计算,因此性能很重要。
signal()(http://www.cplusplus.com/reference/csignal/signal/)是否会导致任何performance loss(某种形式的持续监视?)或根本不会导致(仅在发生异常时触发,否则不会导致性能下降)。

编辑:我的软件在Windows(7和更高版本)和OS X(10.7和更高版本)上运行。

最佳答案

如果您的时间紧迫过程发现了信号,则不会浪费任何“特殊”时间。确实,内核保留了您的进程的信号和 Action 的表,如果发送了信号,内核将必须经过该表。但是,向进程发送消息或调用处理程序的每种方式都需要时间。消息队列或等待“标志”的消息将具有几乎相同的“浪费”。

但是使用信号可能会带来其他影响。如果信号到达,几乎每个系统调用都可以中断。调用的返回值为EINTR。如果传递给进程的信号很多,这可能会使您的应用程序减慢很多速度,因为您必须始终通过再次进入系统调用来检查EINTR。而且每个系统调用都有些昂贵。因此,使用EINTR返回值在系统调用中循环很多可能是一个糟糕的设计。

但是对于您的问题,您只需要查找SIGABRTSIGSEGVSIGILL。这些信号通常仅用于很少的异常(exception)情况。因此,不要害怕根据需要使用它们。但是,请避免将这些信号频繁用于自己的IPC。可以做到,但设计很糟糕。对于用户IPC,有更好的信号名称和更好的方法。

简而言之:对于仅捕获异常信号,这里没有任何时间紧迫的问题。

10-08 04:15