我制作了以下程序来学习SIG_SETMASK
.
以下程序应该阻止SIGINT
中断信号,直到func()
函数调用
sigprocmask(SIG_SETMASK,&fOnemask,NULL);
其中 fOnemask 是空的,因为在它之前没有信号存储在 sigset 中。但正如我所说
sigprocmask(SIG_SETMASK,&fTwoCmask,NULL);
返回之前在函数内部func2()
,其中 fTwomask 包含函数之前的信号列表func()
,程序开始接收信号,当传递 SIGINT 时程序中断。
为什么会这样?
void func();
void func2();
int main()
{
int childpid,child;
childpid=fork();
if(childpid==0)
{
func();
}
while(wait(NULL)>0);
return 0;
}
void func()
{
sigset_t sigmask,fOnemask;
sigemptyset(&sigmask);
sigaddset(&sigmask,SIGINT);
sigprocmask(SIG_SETMASK,&sigmask,&fOnemask);
func2();
int i;
for(i=0;i<10;i++)
{
sleep(1);
printf("%d\n",i);
}
sigprocmask(SIG_SETMASK,&omask,NULL);
printf("returning from func\n");
}
void func2()
{
sigset_t sigmask,fTwomask;
sigemptyset(&sigmask);
sigfillset(&sigmask);
sigprocmask(SIG_SETMASK,&sigmask,&fTwomask);
int i;
for(i=0;i<10;i++)
{
sleep(1);
printf("%d\n",i);
}
sigprocmask(SIG_SETMASK,&fTwomask,NULL);
printf("func2 ending\n");
}