Я сделал следующую программу для изучения поведения 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");
}
func
. Пожалуйста, обновите код (постарайтесь сохранить отступ) на то, что воспроизводит вашу проблему. (Замена main вызовомfunc
без форка работает как положено, sigint остается заблокированным.) - person Mat   schedule 06.01.2013func
илиfunc2
. Пожалуйста, опубликуйте точный код, с которым вы играете. - person Mat   schedule 06.01.2013sigemptyset()
иsigfillset()
, как и вfunc2()
, являются избыточными; в контексте вызывать толькоsigfillset()
. - person Jonathan Leffler   schedule 06.01.2013sigset_t
obj в основную функцию, а затем вызову foo() из main. Затем я добавляю сигнал в другой объект sigset_t, локальный для foo(), напримерsigprocmask(SIG_SETMASK,&foomask,&oldmask)
. Когда я позвонюsigprocmask(SIG_SETMASK,&oldset,NULL)
, что сделаетsigprocmask(SIG_SETMASK,&oldset,NULL)
? - person Alfred   schedule 06.01.2013