gpt4 book ai didi

c++ - 在 OSx 中处理 sigterm

转载 作者:搜寻专家 更新时间:2023-10-31 01:00:41 25 4
gpt4 key购买 nike

我有一个在 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) `

关于c++ - 在 OSx 中处理 sigterm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30516158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com