當我提出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);
}
不錯的圖表! ... – 2015-03-13 13:47:53