https://en.cppreference.com/w/cpp/utility/program/signal
在返回值下指出:
成功时使用先前的信号处理程序,失败时使用SIG_ERR(设置a 信号处理程序在某些实现中可以被禁用)。
我试图了解是否/如何最好地解决了这种情况。例如,这是否表示在支持它的平台上-它从不返回失败代码? (然后可以假定成功)
答案 0 :(得分:0)
例如,这是否表明在支持它的平台上-它从不返回失败代码?
否。
例如,如果您传递了无效的信号编号,则可能会失败,
std::signal(999, signal_handler); /* 999 isn't a valid signal number */
如果您尝试为SIGKILL
或SIGSTOP
设置处理程序,也可能会失败,因为它们无法被捕获或忽略。
在某些实现中可以禁用设置信号处理程序。
这只是一个附加信息,以防万一您正确调用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";
...
}