解决sigprocmask和pause之间的时间窗口问题,如果分开调用sigprocmask和pause,如果pause所等待发生的信号,在这个时间窗口内发生了,那么pause就错过了这个信号,导致pause无限等待。
sigsuspend原子化sigprocmask和pause,关闭了这个时间窗口。
值得注意的是,当 sigsuspend 返回的时候,它会把信号屏蔽字(signal mask) 重新设置为原来的值。
所以,sigsuspend 原子化以下的操作;
...
sigset_t oldmask, newmask;
sigemptyset (&newmask);
sigaddset (&newmask, SIGUSR1);
...
sigprocmask (SIG_SETMASK,sigemptyset (&newmask);
sigaddset (&newmask, SIGUSR1); &newmask, &oldmask);
pause (N_SECOND);
sigprocmask (SIG_SETMASK, &oldmask, NULL);