2014-02-24 46 views
1

根據man -S 7 signal,當未定義信號處理程序的程序收到SIGTERM時,默認動作爲Term如何以編程方式獲取sigterm在自定義信號處理程序中的默認行爲?

我註冊一個自定義的信號處理程序SIGTERM,但我想最後的陳述(具體清理工作後)我的自定義處理程序是一個函數調用中實現了與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收到的代碼。
  2. //signal線在註釋後面,exit(0)在評論回來,代碼將打印二者Constructing!Dying!
  3. exit(0)被註釋出來,abort()被註釋中,程序將輸出Constructing!隨後Aborted (core dumped)

要問我的問題,以另一種方式,我想知道我需要什麼就擺在signal_handler身體爲了模仿在各方面的行爲1(不只是輸出I顯示)。

回答

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

沒有函數調用,因爲在信號終止是由內核,而不是用戶進程處理,但是這將恢復默認的處理程序,然後將信號發送給自己,殺死的過程就像信號從未被捕獲。

1

您可以調用_exit而不是exit,它應該退出進程而不運行全局析構函數。

相關問題