【发布时间】:2014-05-22 11:06:45
【问题描述】:
我的应用程序已经配置了一个SIGTERM 处理程序。
例如:
Signal(SIGTERM, &signalHandler);
我想在关机前进行一些处理,但我无法更改现有的信号处理程序。 为了做我的处理,我放了一个像这样的钩子 将我的处理程序配置为
signal(SIGTERM, &mySignalHandler);
mySignalHandler 在进行处理后调用signalHandler 以使系统即使在钩子之后也不受影响。
现在,考虑到mySignalHandler 将被调用,它在kill $pid 一次时起作用。
但如果我做两次或更多次。 signalHandler 被调用。据我所知SIG_DFL应该在这种情况下执行。
任何人都知道这样做的原因。
我正在使用“Red Hat Enterprise Linux AS 第 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);
}
我面临的问题是,在每次杀死 $pid 时,它都会调用 signalHandlerSecond。因为我正在使用 #undef _GNU_SOURCE 并尝试了 #undef _BSD_SOURCE。但它应该将其重置为 SIG_DFL。
谁能指出我做错了什么?
【问题讨论】:
-
The man page 表示重置为 SIG_DFL 是原始的 Unix 行为。在 Linux 上,它具有 BSD 行为(如果
_BSD_SOURCE)或系统 V 行为(如果源被编译为严格标准)。如果您使用-std=cXX而不是-std=gnuXX进行编译,那么也许您可以尝试使用 GNU 功能进行编译,或者定义_BSD_SOURCE。