当我在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);
}
答案 0 :(得分:2)
当我在SIGUSR1处理程序中引发SIGUSR2时,它不应该被阻止吗?
没有。这就是发生的事情:
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);
}