の振る舞いを学ぶために以下のプログラムを作成しました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");
}