用std :: signal设置信号处理程序-是否有失败的“条件”?

时间:2019-09-13 09:15:04

标签: c++ signals posix c++17

看着reference

https://en.cppreference.com/w/cpp/utility/program/signal

在返回值下指出:

  

成功时使用先前的信号处理程序,失败时使用SIG_ERR(设置a   信号处理程序在某些实现中可以被禁用)。

我试图了解是否/如何最好地解决了这种情况。例如,这是否表示在支持它的平台上-它从不返回失败代码? (然后可以假定成功)

1 个答案:

答案 0 :(得分:0)

  

例如,这是否表明在支持它的平台上-它从不返回失败代码?

否。

例如,如果您传递了无效的信号编号,则可能会失败,

std::signal(999, signal_handler); /* 999 isn't a valid signal number */

如果您尝试为SIGKILLSIGSTOP设置处理程序,也可能会失败,因为它们无法被捕获或忽略。

  

在某些实现中可以禁用设置信号处理程序。

这只是一个附加信息,以防万一您正确调用std::signal却可能返回SIG_ERR。这并不表示std::signal不会因任何其他原因而失败。

在实践中,您始终需要检查返回值,以便可以确保信号处理程序确实按预期设置/处于活动状态,如果失败,则进行相应处理。

if ( std::signal(SIGINT, signal_handler) == SIG_ERR ) {
    std::cerr << "Couldn't set a signal handler for SIGINT\n";
    ...
}