Как заблокировать сигналы в C?
Я пытаюсь создать программу, которая блокирует сигнал SIGUSR1 и разблокирует сигнал. В середине я хочу видеть, что сигнал блокируется с помощью sigpending
, Но это всегда говорит о том, что сигнал не заблокирован, и я могу использовать сигнал, когда он должен быть заблокирован. Это код, который у меня есть.
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
static void signals(int signaln)
{
switch (signaln) {
case SIGUSR1:
printf("Signal SIGUSR1\n"); break;
}
return;
}
main()
{
sigset_t set,set2;
struct sigaction sigs;
sigs.sa_handler = signals;
sigemptyset(&sigs.sa_mask);
sigs.sa_flags=SA_ONESHOT;
sigaction(SIGUSR1, &sigs,0);
sigemptyset(&set);
sigemptyset(&set2);
sigaddset(&set,SIGUSR1);
if(sigprocmask(SIG_BLOCK, &set, NULL)==0){
printf("Blocking SISGUSR1...\n");
}
sigpending(&set2);
if (sigismember(&set2,SIGUSR1)==1)
{
printf("The signal is blocked\n"); //it should print this
}
wait(2);
kill(getpid(),SIGUSR1); //the signal shouldn't work
wait(2);
if(sigprocmask(SIG_UNBLOCK, &set, NULL)==0){
printf("Unblocking SIGUSR1\n");
}
}
Кто-нибудь может мне помочь?
1 ответ
sigpending
не говорит вам, заблокирован ли сигнал. Он сообщает вам, ожидает ли сигнал доставки. (т. е. сигнал заблокирован, а один отправлен).
Кроме того, заблокированный не означает, что сигнал не будет доставлен; это означает, что сигнал не будет доставлен сейчас. Таким образом, вы можете отправить сигнал, и он будет доставлен, как только сигнал разблокируется; вероятно после звонка sigprocmask(SIGUNBLOCKED...)
но до звонка printf
, так что вы, вероятно, увидите сообщение о получении сигнала до того, как увидите сообщение "разблокировки".