gpt4 book ai didi

c++ - 面对 SIGTERM 的信号处理程序问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:50 27 4
gpt4 key购买 nike

<分区>

我的应用程序已经配置了一个 SIGTERM 处理程序。例如:

Signal(SIGTERM, &signalHandler);

我想在关机前做一些处理,我不能改变现有的信号处理程序。为了进行处理,我放置了一个这样的钩子(Hook)将我的处理程序配置为

signal(SIGTERM, &mySignalHandler);

mySignalHandler 在完成其处理之后调用 signalHandler 以使系统即使在 hook 之后也不受影响。

现在,考虑到 mySignalHandler 将被调用的事实,它在 kill $pid 一次时起作用。但如果我这样做两次或更多次。 signalHandler 被调用。据我所知,在这种情况下应该执行 SIG_DFL

任何人都知道这是为什么。

我正在使用“Red Hat Enterprise Linux AS release 4 (Nahant Update 8)”

[编辑]:面对测试程序的奇怪行为

#undef _GNU_SOURCE
using namespace std;

volatile sig_atomic_t signalHandlerVar_ = false;
volatile sig_atomic_t signalHandlerSecondVar_ = false;

extern "C" void signalHandler(int)
{
signalHandlerVar_ = true;
}

extern "C" void signalHandlerSecond(int value)
{
signalHandlerSecondVar_ = true;
}

void* threadFunc(void*)
{
while(1)
{
if(signalHandlerVar_)
{
cout<<"signalHandler_ "<<signalHandlerVar_<<endl;
signalHandlerVar_ = false;
}

if(signalHandlerSecondVar_)
{
cout<<"signalHandlerSecond_ "<<signalHandlerSecondVar_<<endl;
signalHandlerSecondVar_ = false;
}
}

return NULL;
}

int main()
{
::signal(SIGTERM, &signalHandler);
::signal(SIGTERM, &signalHandlerSecond);
pthread_t thread;

if(pthread_create(&thread, NULL, &threadFunc, NULL))
{
cout<<"pthread create failed"<<endl;
return 1;
}
pthread_join(thread, NULL);
}

这是我面临的问题,在每次 kill $pid 时它调用 signalHandlerSecond。因为我正在使用 #undef _GNU_SOURCE 并尝试了 #undef _BSD_SOURCE。但它应该将其重置为 SIG_DFL。

谁能告诉我哪里做错了?

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