尽管有信号处理,但Ctrl + c会杀死进程,并且可以在其他计算机上运行

时间:2018-11-09 09:09:01

标签: c++ linux signal-handling

我正在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发出信号通知主线程关闭。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我不会处理产生新线程的信号,但我只想使用signal()(请参见“ man 2信号”)。

我猜想因为您没有使用signal()安装新的信号处理程序(尽管其名称为SignalHandler()并不是信号处理程序,它只是线程的执行循环),因此默认一个仍然活跃。在某些系统上,您的线程速度更快并且可以正确退出,在其他系统上,SIGINT的默认处理程序胜出,并且您的应用程序被杀死。

也许,另一种方法是使用sigprocmask()禁用进程中的信号,但这将是一种奇怪的信号处理方法。

但是我猜到了。您的示例不起作用-如果我的猜测是错误的,我建议按照stackoverflow指南中的建议准备MCVE