我正在xubuntu上运行C ++应用程序,并实现了处理SIGINT的信号处理程序。我的实现应该很好,因为它可以在除我的以外的所有其他机器(相同的OS)上工作。 “正在工作”是指信号被信号处理程序线程接收并执行受控关闭。
在我的机器上,ctrl + c会直接杀死我的应用程序。根本不需要处理,控制台上只有一个“ ^ C”。
有人知道为什么这种行为与机器有关吗?有什么我可以检查的设置吗?谢谢。
编辑: 看看它是否与终端ctrl + c的行为有关,我尝试用-2 PID代替ctrl + c:行为相同,我的机器上没有处理,在其他机器上按预期处理。
这是我的信号处理程序的代码示例:
std::atomic_bool shutdown_requested;
void SignalHandler() {
sigset_t signal_set;
sigemptyset(&signal_set);
sigaddset(&signal_set, SIGTERM);
sigaddset(&signal_set, SIGINT);
while (!shutdown_requested) {
int sig = SIGUNUSED;
sigwait(&signal_set, &sig);
switch (sig) {
case SIGINT:
case SIGTERM:
shutdown_requested = true;
break;
}
}
}
void SetSignalHandler() {
sigset_t signals;
sigfillset(&signals);
pthread_sigmask(SIG_SETMASK, &signals, nullptr);
std::thread(SignalHandler);
}
atomic shutdown_requested发出信号通知主线程关闭。有什么想法吗?
答案 0 :(得分:0)
我不会处理产生新线程的信号,但我只想使用signal()
(请参见“ man 2信号”)。
我猜想因为您没有使用signal()
安装新的信号处理程序(尽管其名称为SignalHandler()
并不是信号处理程序,它只是线程的执行循环),因此默认一个仍然活跃。在某些系统上,您的线程速度更快并且可以正确退出,在其他系统上,SIGINT的默认处理程序胜出,并且您的应用程序被杀死。
也许,另一种方法是使用sigprocmask()
禁用进程中的信号,但这将是一种奇怪的信号处理方法。
但是我猜到了。您的示例不起作用-如果我的猜测是错误的,我建议按照stackoverflow指南中的建议准备MCVE。