如何以编程方式在自定义信号处理程序中获取sigterm的默认行为?

时间:2014-02-24 23:49:22

标签: c++ c unix signals

基于man -S 7 signal,当未定义信号处理程序的程序收到SIGTERM时,默认操作为Term

我正在为SIGTERM注册一个自定义信号处理程序,但我希望在我的自定义处理程序中的最终语句(在完成特定清理之后)一个函数调用,它实现与{的完全相同的效果{1}}。

在这里打电话的正确功能是什么?

我尝试了Term,但这会导致调用静态初始化对象的析构函数,这与exit(0)的行为不匹配。我也尝试了Term,这会导致核心转储。

在下面的示例中,我使用静态分配对象的生命周期作为说明性示例,但我的问题不仅仅是静态分配对象的生命周期。

abort()

以下是各种行为:

  1. 如果收到#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!
  2. 重新注释Dying!行后,SIGTERM被重新注明,代码将同时打印//signalexit(0)
  3. Constructing!被注释掉,Dying!被注释时,程序将输出exit(0),然后输出abort()
  4. 以另一种方式提问我的问题,我想知道我需要在Constructing!的主体中放置什么,以便在各方面模仿行为1(而不仅仅是我已经显示的输出)。

2 个答案:

答案 0 :(得分:3)

signal(SIGTERM, SIG_DFL);
kill(getpid(), SIGTERM);

没有函数调用,因为内核处理信号终止,而不是用户进程,但是这将恢复默认处理程序,然后向自己发送信号,这就像信号从未被杀过一样。捕获。

答案 1 :(得分:1)

您可以调用_exit而不是exit,它应该在不运行全局析构函数的情况下退出进程。