为什么信号不会被阻挡?

时间:2015-03-13 13:25:50

标签: linux signals

当我在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);
}

1 个答案:

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