【问题标题】:Ctrl+c kills process, despite signal handling, works on different machineCtrl+c 杀死进程,尽管有信号处理,但在不同的机器上工作
【发布时间】:2018-11-09 09:09:01
【问题描述】:

我在 xubuntu 上运行一个 C++ 应用程序并实现了一个处理 SIGINT 的信号处理程序。我的实现应该没问题,因为它可以在所有其他机器(相同的操作系统)上运行——除了我的。 “工作”意味着信号被信号处理线程接收并执行受控关闭。

在我的机器上,ctrl+c 直接杀死了我的应用程序。根本没有处理,控制台上只有一个“^C”。

有谁知道为什么这种行为依赖于机器?有什么我可以检查的设置吗?谢谢。

编辑: 看看它是否与终端 ctrl+c 行为有关,我尝试 kill -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);
}

原子的 shutdown_requested 信号通知主线程关闭。有什么想法吗?

【问题讨论】:

  • 根据man signal(7),SIGINT 为2。您是否尝试过kill -2 PID?我怀疑 Ctrl+C 是否在每个 shell/终端中都被处理相同并且用谷歌搜索了一下。这可能会有所帮助:SU: What to do when Ctrl + C can't kill a process?(这实际上是相反的问题,但恕我直言,答案也适用于您的问题。)
  • Scheff 提出了重要的一点 - 可以在终端中配置 Ctrl+C 以发送与 SIGINT 不同的信号,并尝试使用 kill -2 PID 重现它将确定是否是这种情况。
  • 好点,我刚刚尝试了 kill -2 PID:相同的行为,在我的机器上没有处理,在其他机器上按预期处理。这真的很奇怪。我开始怀疑这是否与正在运行的多个线程有关。但是,它在其他机器上运行良好仍然没有任何意义。
  • 线程和不同机器上的不同行为对竞争条件有影响。也许如果您发布一些代码,有人可以看到问题出在哪里。
  • @LuisGP 我编辑了我的帖子并添加了一个代码示例。

标签: c++ linux signal-handling


【解决方案1】:

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

我猜由于您没有使用signal() 安装新的信号处理程序(尽管它的名称,您的SignalHandler() 不是信号处理程序,它只是线程的执行循环),默认的保持活动状态。在某些系统上,您的线程更快并正确退出,在其他系统上,SIGINT 的默认处理程序获胜,您的应用程序被杀死。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-01
    • 2011-03-28
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多