2017-06-04 35 views
0

我按照以下意圖編寫了以下代碼: 子級向父級發送SIGKILL信號,然後父級會使用處理程序處理它。處理程序只是增加計數器。爲什麼SIGKILL不是由我的信號處理程序處理的,有時會導致帳戶註銷

int counter = 0;                 

void handler(int sig) {               
    counter++;                  
    sleep(1); /* Do some work in the handler */         
    return;                  
}                    

int main() {                  
    int i;                   

    //signal(SIGUSR2, handler);             
    signal(SIGKILL, handler);              

    if (fork() == 0) { /* Child */            
    for (i = 0; i < 5; i++) {             
     //kill(getppid(), SIGUSR2);            
     kill(getppid(), SIGKILL);             
     printf("sent SIGKILL to parent %d\n", getppid());       
    }                   
    exit(0);                  
    }                    

    wait(NULL);                 
    printf("counter=%d\n", counter);            
    exit(0);                  
}  

然而,第一種輸出我得到的是:

sent SIGKILL to parent 8371 
sent SIGKILL to parent 8371 
sent SIGKILL to parent 8371 
sent SIGKILL to parent 8371 
sent SIGKILL to parent 8371 
Killed 

顯然,SIGKILL殺死父進程。爲什麼會發生這種情況,因爲我的處理程序不會殺死父母?

另一個非確定性但很高的概率事件(〜50%)是在我的ubuntu 14.04 64位機器上。如果我執行此代碼,我將自動從帳戶中註銷。爲什麼會發生?

回答

0

您是否閱讀signal()的手冊?

第一:

信號的行爲()跨越UNIX版本而變化,並且還跨越不同版本的Linux歷史變化。避免使用它:改爲使用sigaction(2)。見下面的可移植性。

二:

的信號SIGKILL和SIGSTOP不能被捕獲或忽略。

相關問題