Согласно справочной странице sigsuspend (), он заменит текущую маску сигнала, установленную на 1-й параметр. В APUE я видел пример следующим образом. Код может быть слишком длинным, но я не хочу ничего пропустить.
int pr_mask(char *s)
{
sigset_t sigset;
sigprocmask(0, NULL, &sigset);
printf("%s: ", s);
if(sigismember(&sigset, SIGINT)) printf("SIGINT ");
if(sigismember(&sigset, SIGQUIT)) printf("SIGQUIT ");
if(sigismember(&sigset, SIGUSR1)) printf("SIGUSR1 ");
if(sigismember(&sigset, SIGALRM)) printf("SIGALRM ");
/* ..... */
printf("\n");
return 0;
}
void sig_quit(int signo)
{
pr_mask("in sig quit");
}
int main()
{
sigset_t new, old, tempset;
signal(SIGQUIT, sig_quit);
sigemptyset(&tempset);
sigaddset(&tempset, SIGINT);
sigemptyset(&new);
sigaddset(&new, SIGQUIT);
sigprocmask(SIG_BLOCK, &new, &old);
pr_mask("in critical section");
/* critical section */
sigsuspend(&tempset);
pr_mask("after return form sigsuspend");
sigprocmask(SIG_UNBLOCK, &new, NULL);
pr_mask("program exit");
return 0;
}
Вывод:
in critical section: SIGQUIT
in sig quit: SIGINT SIGQUIT
after return form sigsuspend: SIGQUIT
program exit:
Проблема во второй строке. SIGQUIT
все еще находится в наборе маски сигнала.
Должно ли это быть только SIGINT
, поскольку sigsuspend уже заменил маску сигнала на tempset
, который установлен только на SIGINT
?