基于man -S 7 signal
,当未定义信号处理程序的程序收到SIGTERM
时,默认操作为Term
。
我正在为SIGTERM
注册一个自定义信号处理程序,但我希望在我的自定义处理程序中的最终语句(在完成特定清理之后)一个函数调用,它实现与{的完全相同的效果{1}}。
在这里打电话的正确功能是什么?
我尝试了Term
,但这会导致调用静态初始化对象的析构函数,这与exit(0)
的行为不匹配。我也尝试了Term
,这会导致核心转储。
在下面的示例中,我使用静态分配对象的生命周期作为说明性示例,但我的问题不仅仅是静态分配对象的生命周期。
abort()
以下是各种行为:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
struct Foo{
~Foo() {
fprintf(stderr, "Dying!\n");
}
Foo() {
fprintf(stderr, "Constructing!\n");
}
};
Foo foo;
void sig_handler(int signo) {
// exit(0);
// abort();
}
int main(){
// signal(SIGTERM, sig_handler);
while(1);
}
,代码将按[{1}}打印,但不会Constructing!
。Dying!
行后,SIGTERM
被重新注明,代码将同时打印//signal
和exit(0)
Constructing!
被注释掉,Dying!
被注释时,程序将输出exit(0)
,然后输出abort()
。以另一种方式提问我的问题,我想知道我需要在Constructing!
的主体中放置什么,以便在各方面模仿行为1(而不仅仅是我已经显示的输出)。
答案 0 :(得分:3)
signal(SIGTERM, SIG_DFL);
kill(getpid(), SIGTERM);
没有函数调用,因为内核处理信号终止,而不是用户进程,但是这将恢复默认处理程序,然后向自己发送信号,这就像信号从未被杀过一样。捕获。
答案 1 :(得分:1)
您可以调用_exit
而不是exit
,它应该在不运行全局析构函数的情况下退出进程。