在OSx中处理符号
handling sigterm in OSx
我在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中处理信号的正确方法是什么?
发送信号后,调试器停止,您必须继续到达信号处理程序中的断点。
(lldb) break set -n term_handler Breakpoint 1: where = a.out`term_handler(int) + 4 at sig.cc:11, address = 0x0000000100000f54 (lldb) run Process 42532 launched: './a.out' (x86_64) Process 42532 stopped * thread #1: tid = 0x18dc39, 0x0000000100000f30 a.out`main(argc=15, argv=0x00007fff5fbffb58) + 32 at sig.cc:17, queue = 'com.apple.main-thread', stop reason = signal SIGTERM frame #0: 0x0000000100000f30 a.out`main(argc=15, argv=0x00007fff5fbffb58) + 32 at sig.cc:17 14 int main(int argc, const char * argv[]) 15 { 16 std::signal(SIGTERM, term_handler); -> 17 while (!gDone); 18 std::puts("done!"); 19 return 0; 20 } (lldb) c Process 42532 resuming Process 42532 stopped * thread #1: tid = 0x18dc39, 0x0000000100000f54 a.out`term_handler(i=15) + 4 at sig.cc:11, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 frame #0: 0x0000000100000f54 a.out`term_handler(i=15) + 4 at sig.cc:11 8 9 static void term_handler(int i) 10 { -> 11 gDone = 1; 12 } 13 14 int main(int argc, const char * argv[]) (lldb) `
好了,我现在回家了,在我的Mac上工作。再一次,你的代码(特别是第二个示例)被证明是很好的。在Terminal中使用gcc和kill -TERM进行确认。像一般情况一样,Source指的是SIGTERM,而kill指的是TERM(在OS X上)。你看到的XCode暂停是由于XCode,而不是你的代码。我尝试了两种方法,Terminal和XCode。然而,我找不到一个前缀来阻止这种中断。
只是集中在这里…你问,代码有问题吗?回答:没有。你问,在OSX中处理信号的正确方法是什么?答案:你已经在这么做了。新问题:我如何得到XCode (lldb)不暂停时信号发生?回答:如何告诉LLDB调试器不处理SIGBUS?
您的代码很好。杀:
kill -SIGTERM 31573
因为kill -9 31573
,其中31573是我的进程ID,没有正常退出。我在你的代码中添加了一个printf来告诉我它正在优雅地退出。
相关文章:
- 如果我想链接静态库并删除未使用的符号.txt我应该如何处理 Cmakelist
- 使用 googletest 测试嵌入式C++代码时处理外设寄存器的重复符号
- 在 Mac 上C++编译代码时处理“dyld:惰性符号绑定失败:找不到符号”错误
- 带有符号API的MXNET:批处理归一化更新
- 如何处理更改插入符号位置的事件
- 重命名批处理文件(删除名称中的一些符号)(python/matlab/shell)
- GetWindowText 无法处理商标符号
- 使用无符号字符数组处理单个字节
- C++ 不合逻辑 >= 处理 vector.size() 时的比较很可能是由于size_type是无符号的
- 如何在删除或处理文件夹树时处理符号链接和连接
- 正确处理有符号值和无符号值的比较
- gcc 预处理的表单哈希符号 + 数字"# 1"输出行是什么意思?
- VS 2012 调试 处理<文件时出现意外的符号读取器错误.exe>
- 编译器构造:处理对无序符号的引用
- 无法从C++代码中检索正确的字符串.是否有一种通用类型用于处理c#上的无符号字符*
- 如何为符号信号编写信号处理程序
- 处理c++角度中的符号变化
- 我是否应该在每次知道我正在处理无符号值时使用"unsigned"?
- 导出符号时如何处理多个库
- 编译器错误LKN2019:处理继承时无法解析外部符号