1

シグナル 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");
  }
}

誰でも私を助けることができますか?

4

1 に答える 1

3

sigpending信号がブロックされているかどうかはわかりません。信号が配信されるのを待っているかどうかを示します。(つまり、信号がブロックされ 1つが送信されました。)

また、ブロックされたからといって、信号が配信されないということにはなりません。これは、信号が現在配信されないことを意味します。したがって、シグナルを送信することができ、シグナルのブロックが解除されるとすぐに配信されます。おそらくへの呼び出しの後、への呼び出しsigprocmask(SIGUNBLOCKED...)の前にprintf、「ブロック解除」メッセージが表示される前に、シグナル受信メッセージが表示される可能性があります。

于 2012-11-20T20:17:43.467 に答える