根據sigsuspend()的手冊頁,它將用第一個參數替換當前的信號掩碼組。在APUE中,我看到一個例子如下。代碼可能有點太長,但我不想錯過任何東西。sigsuspend(),替換set還是add?
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
?