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 中处理信号的正确方法是什么?
你的代码没问题。杀死:
kill -SIGTERM 31573
因为
kill -9 31573
其中 31573 是我的进程 ID,没有正常退出。我在您的代码中添加了一个 printf 以告诉我它正在正常退出。
发送信号后,调试器停止,您必须继续到达信号处理程序中的断点。
(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。同样,您的代码(特别是第二个示例)已被证明很好。确认是在终端中使用 gcc 和 "kill -TERM " 完成的。与正常情况一样,source 指的是 SIGTERM,但 kill 指的是(在 OS X 上)TERM。您看到的 XCode 暂停是由于 XCode 而不是您的代码。我尝试了两种方式,Terminal 和 XCode。但是,我找不到抑制该中断的首选项。
这里只是重点...你问,代码有问题吗?答:不。您问过,在 OSX 中处理信号的正确方法是什么?回答:按照您已经在做的方式。新问题:如何让 XCode (lldb) 在信号出现时不暂停?答案:How to tell LLDB debugger not to handle SIGBUS?
我在 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 中处理信号的正确方法是什么?
你的代码没问题。杀死:
kill -SIGTERM 31573
因为
kill -9 31573
其中 31573 是我的进程 ID,没有正常退出。我在您的代码中添加了一个 printf 以告诉我它正在正常退出。
发送信号后,调试器停止,您必须继续到达信号处理程序中的断点。
(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。同样,您的代码(特别是第二个示例)已被证明很好。确认是在终端中使用 gcc 和 "kill -TERM " 完成的。与正常情况一样,source 指的是 SIGTERM,但 kill 指的是(在 OS X 上)TERM。您看到的 XCode 暂停是由于 XCode 而不是您的代码。我尝试了两种方式,Terminal 和 XCode。但是,我找不到抑制该中断的首选项。
这里只是重点...你问,代码有问题吗?答:不。您问过,在 OSX 中处理信号的正确方法是什么?回答:按照您已经在做的方式。新问题:如何让 XCode (lldb) 在信号出现时不暂停?答案:How to tell LLDB debugger not to handle SIGBUS?