signal() :对性能有影响吗?
signal() : any performance impact?
我需要捕获 SIGABRT, SIGSEGV and SIGILL
以便在我无法控制的事情失败并且程序需要退出时向用户显示正确的严重错误消息。
但是我的程序做了很多实时计算,所以性能很重要。
signal()
( http://www.cplusplus.com/reference/csignal/signal/ ) 是否会导致任何 performance loss
(某种持续监控?)或根本不会(仅在异常发生时触发,否则不会损失性能) .
编辑:我的软件在 Windows(7 及更高版本)和 OS X(10.7 及更高版本)上运行。
如果您的时间关键进程捕获信号,则不会 "special" 浪费时间。实际上,内核为您的进程保留了 table 个信号和操作,如果发送了信号,它必须经过这些信号和操作。但是向进程发送消息或调用处理程序的每种方式都需要时间。消息队列或等待 "flag" 将具有几乎相同的 "waste".
但使用信号可能会有其他应提及的含义。如果信号到达,几乎每个系统调用都可以被中断。来自调用的 return 值为 EINTR
。如果您有很多信号传递给您的进程,这可能会大大降低您的应用程序的速度,因为您必须始终检查 EINTR
并再次进入系统调用。而且每个系统调用都有点昂贵。因此,使用 EINTR
return 值在系统调用上循环很多可能是一个糟糕的设计。
但是对于您的问题,您只查找 SIGABRT
、SIGSEGV
和 SIGILL
。这些信号通常仅用于极少数例外情况。所以不要害怕根据需要使用它们。但避免为自己的 IPC 频繁使用这些信号。这可以做到,但设计非常糟糕。对于用户 IPC,有更好的信号名称和更好的方法。
简而言之:对于仅捕获异常信号,您在这里没有任何时间关键问题。
我需要捕获 SIGABRT, SIGSEGV and SIGILL
以便在我无法控制的事情失败并且程序需要退出时向用户显示正确的严重错误消息。
但是我的程序做了很多实时计算,所以性能很重要。
signal()
( http://www.cplusplus.com/reference/csignal/signal/ ) 是否会导致任何 performance loss
(某种持续监控?)或根本不会(仅在异常发生时触发,否则不会损失性能) .
编辑:我的软件在 Windows(7 及更高版本)和 OS X(10.7 及更高版本)上运行。
如果您的时间关键进程捕获信号,则不会 "special" 浪费时间。实际上,内核为您的进程保留了 table 个信号和操作,如果发送了信号,它必须经过这些信号和操作。但是向进程发送消息或调用处理程序的每种方式都需要时间。消息队列或等待 "flag" 将具有几乎相同的 "waste".
但使用信号可能会有其他应提及的含义。如果信号到达,几乎每个系统调用都可以被中断。来自调用的 return 值为 EINTR
。如果您有很多信号传递给您的进程,这可能会大大降低您的应用程序的速度,因为您必须始终检查 EINTR
并再次进入系统调用。而且每个系统调用都有点昂贵。因此,使用 EINTR
return 值在系统调用上循环很多可能是一个糟糕的设计。
但是对于您的问题,您只查找 SIGABRT
、SIGSEGV
和 SIGILL
。这些信号通常仅用于极少数例外情况。所以不要害怕根据需要使用它们。但避免为自己的 IPC 频繁使用这些信号。这可以做到,但设计非常糟糕。对于用户 IPC,有更好的信号名称和更好的方法。
简而言之:对于仅捕获异常信号,您在这里没有任何时间关键问题。