关于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个这个进程发送这个信号试一下.