为什么信号没有被屏蔽?
Why isnt the signal getting blocked?
当我在 SIGUSR1 处理程序中引发 SIGUSR2 时,它不应该被阻止吗?此代码打印 "second - Inside first"
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);
}
When I raise SIGUSR2 inside the SIGUSR1 handler, shouldn't it get blocked ?
没有。这是正在发生的事情:
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);
}
当我在 SIGUSR1 处理程序中引发 SIGUSR2 时,它不应该被阻止吗?此代码打印 "second - Inside first"
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);
}
When I raise SIGUSR2 inside the SIGUSR1 handler, shouldn't it get blocked ?
没有。这是正在发生的事情:
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);
}