signal():任何性能影响?

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及更高版本)上运行.

Kla*_*aus 8

如果您的时间关键过程捕获信号,则没有"特殊"时间浪费.实际上,内核为您的进程保存了一个信号和动作表,如果发送了信号,它必须通过该表.但是,向进程发送消息或调用处理程序的每种方式都需要时间.消息队列或等待"标志"将具有几乎相同的"浪费".

但是使用信号可能会有其他含义,应该提到.如果信号到达,几乎每个系统调用都可以被中断.来电的返回值是EINTR.如果你传递给你的进程有很多信号,这可能会大大减慢你的应用程序,因为你必须经常检查EINTR再次进入系统调用.每个系统调用都有点贵.因此,使用EINTR返回值循环很多系统调用可能是一个糟糕的设计.

但是对于你的问题,你只需要寻找SIGABRT,SIGSEGVSIGILL.这些信号通常仅用于很少的例外.所以不要害怕根据需要使用它们.但请避免频繁使用这些信号用于自己的IPC.这可以做到,但设计非常糟糕.对于用户IPC,有更好的信号名称和更好的方法.

简而言之:对于仅捕获异常信号,此处没有任何时间关键问题.

  • @user3767622 - 就其价值而言,几乎每个操作系统都会使用 SIGABRT、SIGSEGV 和 SIGILL 的默认信号处理程序来启动进程,因为默认情况下这些信号是导致进程退出的致命信号。您所做的就是用您自己的信号处理程序替换现有的信号处理程序。 (2认同)