根據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);
}
這裏有各種行爲:
- 按原樣將打印
Constructing!
但不Dying!
如果SIGTERM
收到的代碼。 - 當
//signal
線在註釋後面,exit(0)
在評論回來,代碼將打印二者Constructing!
和Dying!
- 當
exit(0)
被註釋出來,abort()
被註釋中,程序將輸出Constructing!
隨後Aborted (core dumped)
。
要問我的問題,以另一種方式,我想知道我需要什麼就擺在signal_handler
身體爲了模仿在各方面的行爲1(不只是輸出I顯示)。