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