signal():任何性能影响

signal() : any performance impact?

本文关键字:性能 影响 任何 signal      更新时间:2023-10-16

当我无法控制的事情发生故障,程序需要退出时,我需要捕获SIGABRT, SIGSEGV and SIGILL,向用户显示一条正确的严重错误消息。

然而,我的程序做了很多实时计算,所以性能很重要。

signal()(http://www.cplusplus.com/reference/csignal/signal/(导致任何performance loss(某种持续监视?(或根本不(仅在发生异常时触发,否则不会损失性能(。

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

如果您的时间关键型进程捕捉到信号,就不会有"特殊"的时间浪费。事实上,内核为您的进程保存了一个信号和操作表,如果发送了信号,它必须遍历该表。但是,向进程发送消息或调用处理程序的每一种方式都需要时间。消息队列或等待"标志"将具有几乎相同的"浪费"。

但是,使用信号可能有其他需要提及的含义。如果信号到达,几乎每个系统调用都可能被中断。调用的返回值为EINTR。如果有许多信号传递给进程,这可能会大大降低应用程序的速度,因为在系统调用中必须始终检查EINTR。而且每个系统调用都有点昂贵。因此,在带有EINTR返回值的系统调用上循环很多可能是一种糟糕的设计。

但对于您的问题,您只需要查找SIGABRTSIGSEGVSIGILL。这些信号通常只用于很少出现的例外情况。所以,不要害怕根据需要使用它们。但避免经常将这些信号用于自己的IPC。这是可以做到的,但设计非常糟糕。对于用户IPC,有更好的信号名称和更好的方法。

简而言之:只捕获异常信号,这里没有任何时间关键问题。