【发布时间】: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