使用信号侦听器线程 - 我该如何停止它?
Using a signal listener thread - how do I stop it?
我的主要方法的一个片段:
std::atomic_bool runflag;
// ...
std::thread signaller([&]() mutable {
while (runflag) {
int sig;
int rcode = sigwait(&set, &sig);
if (rcode == 0) {
switch (sig) {
case SIGINT: {
// handle ^C
}
}
}
}
});
while (runflag) {
next = cin.get();
// handle character input
}
signaller.join();
我正在使用基于 sigwait()
的方法来检测从命令行发送的 SIGINT
。
signaller
线程使用 sigwait()
来侦听信号。当 runflag
设置为 false 时程序终止。但是,发生这种情况时,signaller
线程仍会在 sigwait
处被阻塞。我不认为我可以使用条件变量,因为 sigwait 没有办法连接到其中。是否有替代解决方案最好不是 Linux-only?
编辑 1:或者,是否有 sigwait 的可中断版本?
您可以使用 sigtimedwait()
函数,该函数在作为参数给出的超时后 return 秒。
您将需要检查 sigtimedwait()
中的 return 值以检查它是否由于超时或信号到达而完成,然后根据此值您将需要处理信号或仅检查runflag
和 运行 再次 sigtimedwait()
。
这里有来自另一个答案的更多信息:
您可以通过让进程向自身发送另一个信号来唤醒信号处理线程,例如
kill(getpid(), SIGUSR1);
我的主要方法的一个片段:
std::atomic_bool runflag;
// ...
std::thread signaller([&]() mutable {
while (runflag) {
int sig;
int rcode = sigwait(&set, &sig);
if (rcode == 0) {
switch (sig) {
case SIGINT: {
// handle ^C
}
}
}
}
});
while (runflag) {
next = cin.get();
// handle character input
}
signaller.join();
我正在使用基于 sigwait()
的方法来检测从命令行发送的 SIGINT
。
signaller
线程使用 sigwait()
来侦听信号。当 runflag
设置为 false 时程序终止。但是,发生这种情况时,signaller
线程仍会在 sigwait
处被阻塞。我不认为我可以使用条件变量,因为 sigwait 没有办法连接到其中。是否有替代解决方案最好不是 Linux-only?
编辑 1:或者,是否有 sigwait 的可中断版本?
您可以使用 sigtimedwait()
函数,该函数在作为参数给出的超时后 return 秒。
您将需要检查 sigtimedwait()
中的 return 值以检查它是否由于超时或信号到达而完成,然后根据此值您将需要处理信号或仅检查runflag
和 运行 再次 sigtimedwait()
。
这里有来自另一个答案的更多信息:
您可以通过让进程向自身发送另一个信号来唤醒信号处理线程,例如
kill(getpid(), SIGUSR1);