为什么信号没有被屏蔽?

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);
}