【发布时间】:2015-08-11 12:40:14
【问题描述】:
我在 XCode 6 中构建了控制台 C++ 应用程序,并希望向其添加 SIGTERM 处理程序。有很多例子,但我无法让它们起作用。
#include <csignal>
namespace
{
volatile std::sig_atomic_t gDone = 0;
}
static void term_handler(int i)
{
gDone = 1;
}
int main(int argc, const char * argv[])
{
std::signal(SIGTERM, term_handler);
while (!gDone);
return 0;
}
调试器在while 语句处停止,但未调用处理程序。这段代码也有同样的问题
#include <signal.h>
volatile sig_atomic_t gDone = 0;
void term_handler(int i)
{
gDone = 1;
}
int main(int argc, char* argv[])
{
struct sigaction sa;
sigset_t newset;
sigemptyset(&newset);
sigaddset(&newset, SIGHUP);
sigprocmask(SIG_BLOCK, &newset, 0);
sa.sa_handler = term_handler;
sigaction(SIGTERM, &sa, 0);
while(!gDone);
return 0;
}
代码有问题吗?在 OSX 中处理信号的正确方法是什么?
【问题讨论】:
-
你是如何传递信号的?
-
@jxh 使用“kill”。问题是 XCode 中断了循环的执行,实际上显示了执行被 SIGTERM 中断的消息。但处理程序没有被调用。
-
你能把断点放在
return而不是while吗?我不确定while的突破会给你带来什么。 -
@jxh 我没有放任何断点,XCode 会自动完成。我唯一的断点是在处理程序内