2015-03-13 42 views
1

當我在SIGUSR1處理程序中引發SIGUSR2時,它不應該被阻塞嗎?這段代碼打印「第二 - 裏面第一」爲什麼信號不被阻擋?

void 
hand1(int s) { 
    kill(getpid(), SIGUSR2); 
    printf("Inside first"); 
} 

void 
hand2(int s) { 
    printf("second - "); 
} 

main() { 
    signal(SIGUSR1, hand1); 
    signal(SIGUSR2, hand2); 
    kill(getpid(), SIGUSR1); 
} 

回答

2

當我提出SIGUSR2的SIGUSR1處理程序中,應該不是被封鎖?

號這是發生了什麼:

time signal_mask code 
---- ----------- ---- 
0   -  main:signal(SIGUSR1, hand1) 
1   -  main:signal(SIGUSR2, hand1) 
2   -  main:kill(getpid(), SIGUSR1) 
3 USR1   hand1:kill(getpid(), SIGUSR2) 
4 USR1|USR2 hand2:printf("second - ") 
5 USR1   hand1:printf("Inside first") 
6   -  main:... 

don't use signal(), instead prefer sigaction()。前者不保證所有平臺上的處理器語義,後者確實如此。

此外,sigaction使得該處理程序期間被阻止並且其信號明確的則不是。如果您想要在處理程序期間阻止所有信號(並且我通常會建議,因爲更容易推斷您知道不會中斷的函數的行爲),您可以執行類似操作:

int handle_signal(int sig, void (*handler)(int)) { 
    struct sigaction sa = { .sa_flags = 0 }; 

    sigfillset(&sa.sa_mask); // block everything during handler 
    sa.sa_handler = handler; 

    return sigaction(sig, &sa, NULL); 
} 
+0

不錯的圖表! ... – 2015-03-13 13:47:53