2015-11-03 75 views
1

在Linux系統上,信號-KILLTERM發送一個允許應用程序安全關閉的信號。這些問題可能有點理論性,但我想了解它們。殺死-SIGTERM和KILLSIG:安全終止應用程序

  1. 當系統發送終止信號時,它發送到哪裏?

  2. 允許過程或應用程序「安全」終止的時間是什麼?

  3. 是否有一個子進程或類似的東西,在查找此信號的應用程序的後臺運行?

這些問題從Linux看門狗幹,在閱讀手冊頁,我看到看門狗的過程是首先發送一個終止信號給定PID,然後使用kill -9信號給力了。我希望能夠利用監視器內置的安全性。

+1

信號不殺人進程,人(和他們的進程)發送信號殺死進程。 – joop

+1

TERM信號可以被進程的信號處理程序捕獲; KILL不能。因此,看門狗首先嚐試發送SIGTERM並等待一段時間,因此任何使用自定義SIGTERM處理程序的進程都有時間執行它。 「安全」終止是由設計人員構建到應用程序中的東西。 –

回答

1

看到這個代碼,

#include<stdio.h> 
#include<signal.h> 
#include<stdlib.h> 

void cleanUp(){ // Do whatever you want here 
    printf("Safely terminating \n"); 
} 

void hand(int sig){ // called when you are sent SIGTERM 
    /* 
    Here you can safely terminate.. 
    */ 
    atexit(cleanUp); // call cleanUp at exit. 
    exit(0); 
} 

int main(){ 
    signal(SIGTERM, hand); //Assign function to be called on SIGTERM 
    /* 
    Your code goes here. 
    I have put an infinite loop for demonstration. 
    */ 
    printf("Started execution..\n"); 
    for(;;); 
} 

這顯示功能如何被分配到被調用時,信號傳遞到您的應用程序。

爲了提供信號SIGTERM這段代碼,爲此,

kill -SIGTERM <pid> 

這裏,<pid> ID您正在運行的程序的進程ID。

+1

請注意,您不應該在信號處理程序中使用printf()和朋友。 printf()不是信號安全的。 – joop

+0

@joop我同意。這只是爲了證明所有這些都是OP所要求的。 –

+0

這是一個不好的證明,因爲它證明不好的做法。 – joop