#include <signal.h> int sigprocmask( int how, const sigset_t * restrict set, sigset_t *restrict oset); 返回值:若成功则返回0,若失败则返回-1 首先,如果oset是非空指针,那么进程的当前信号屏蔽字通过oset返回 其次,若set是一个非空指针,则参数how指示如何修改当前信号屏蔽字。 How的三种取值: SIG_BLOCK 该进程新的信号平别字是起当前信号平别字和set指向信号集的并集。set包含了我们希望阻塞的附加新号。 SIG_UNBLOCK 该进程新的信号屏蔽字是其当前信号屏蔽字和set所指向信号集部际的交集。set包含了我们希望解除阻塞的信号。 SIG_SETMASK 该进程新的信号屏蔽字将被set指向的信号集的值代替。
一个例子:P259
#include "apue.h" #include "myerr.h" static void sig_quit(int); int main( void ) { sigset_t newmask; sigset_t oldmask; sigset_t pendmask; if ( signal(SIGQUIT, sig_quit) == SIG_ERR) { err_sys("can't catch SIGQUIT"); } /* * Block SIGQUIT and save current signal mask */ sigemptyset( &newmask ); sigaddset( &newmask, SIGQUIT); if ( sigprocmask( SIG_BLOCK, &newmask, &oldmask) < 0 ) { err_sys("SIG_BLOCK error"); } sleep(5); /*SIG_QUIT here will remain pending*/ if (sigpending( &pendmask) < 0) { err_sys("sigpending error"); } if ( sigismember( &pendmask, SIGQUIT) ) { err_sys("\nSIGQUIT pending\n"); } /*Reset signal mask which unblocks SIGQUIT*/ if ( sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) { err_sys("SIG_SETMASK error"); } printf("SIGQUIT unblocked\n"); sleep(5); /*SIGQUIT here will terminate with core file*/ exit(0); } static void sig_quit(int signo) { printf("caught SIGQUIT\n"); if ( signal(SIGQUIT,SIG_DFL) == SIG_ERR) { err_sys("can't reset SIGQUIT"); } }