日期:2014-05-16  浏览次数:20641 次

关于sigpending()无法返回被阻塞信号集的问题
各位大虾,我最近在学习《unix下高级编程》,在练习到sigpending()的调用的时候,发现sigpending()似乎已经失效,无法正确的返回block住的信号。我用的系统是NetBSD3.1(虚拟机)。

#include <signal.h>
#include "ourhdr.h"

static void sig_quit(int);

int
main(void)
{
  int flag1=10;
  int flag2=10;
  sigset_t newmask,oldmask,pendmask;
  if(signal(SIGQUIT,sig_quit)==SIG_ERR)
  printf("cat't catch SIGQUIT\n");
   
   
   
  sigemptyset(&newmask);
  sigaddset(&newmask,SIGQUIT);
  if(sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0)
  printf("SIG_BLOCK error\n");
   
  sleep(20);
   
  if((flag1=sigpending(&pendmask))<0) //a

  printf("sigpending error\n");
   
   
  if(flag2=sigismember(&pendmask,SIGQUIT)) //b
  printf("\nSIGQUIT pending\n");
   
  /*if((sigismember(&pendmask,SIGQUIT))==0)
  printf("\nSIGQUIT not in pendmask\n");
  if((sigismember(&pendmask,SIGQUIT))==-1)
  printf("\nSIGQUIT in pendmask error\n");*/
   
   
  if(sigprocmask(SIG_SETMASK,&oldmask,NULL)<0)
  printf("SIG_SETMASK error\n");
   
  if(sigismember(&newmask,SIGQUIT))
  printf("SIGQUIT newmask\n");
   
  printf("flag1= %d\n",flag1);
  printf("flag2= %d\n",flag2);
  printf("SIGQUIT unblocked\n");
   
  sleep(5);
  exit(0);
}
static void
sig_quit(int signo)
{
  printf("caught SIGQUIT\n");
   
}
   
运行结果是:
./sigpendingtest  
^\
caught SIGQUIT
SIGQUIT newmask
flag1= 0
flag2= 0
SIGQUIT unblocked




//a已经sigpending了,但是在//b行输出的flag是0,也就是说SIGQUIT不是pendmask中的信号。
这个问题是我的系统有问题呢,还是sigpending的调用不正确,还是些什么原因呢?
请各位大虾不吝赐教。


------解决方案--------------------
^\
SIGQUIT pending
caught SIGQUIT
SIGQUIT newmask
flag1= 0
flag2= 1
SIGQUIT unblocked

这是我的Linux下执行结果, Ubuntu704 Kernel2.6.20-16-generic
应该是你的系统问题。

------解决方案--------------------
这个例子我在linux上测试是好用的,可能bsd有什么处理,和虚拟机没关系。
------解决方案--------------------
我在linux上可有.

可能是你用虚拟机时虚拟机把这个信号给拦截了,你用kill个这个进程发送这个信号试一下.