Linux信号有多种说法。一个进程创建一个信号用于发送给另外一个进程叫做发送一个信号,内核创建一个信号叫做生成一个信号,进程自己向自己发送信号叫做唤起一个信号。不过我看也没必要这么学究气。 信号集--signel set,其实就是将多个信号放在集合中进行集中的处理。POSIX.1定义了sigset_t以包涵一个信号集,并且定义了五个处理信号的函数: int sigemptyset(sigset_t *set); int sigfillset(sigset_t *set); int sigaddset(sigset_t *set,int signo); int sigdelset(sigset_t *set,int signo) int sigismember(const sigset_t *set,int signo); 还有一个重要的函数:int sigprocmask(int how,const sigset_t *restrict set,sigset_t *restrict oset); 单纯讲这些函数很难讲明白,下面结合程序来讲,程序来自UNIX环境高级编程: static void sig_quit(int); //信号处理函数 int main( ) { sigset_t newmask,oldmask,pendmask; if(signal(SIGQUIT,sig_quit)==SIG_ERR) err_sys("can not catch SIGQUIT"); ----------------------------------------------------------------------------------------------------------- sigemptyset(&newmask); //清空信号掩码集newmask,不阻塞任何信号 sigaddset(&newmask,SIGQUIT); //将SIGQUIT信号放入信号集newmask中去 if(sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0) //将oldmask 和newmask合并 err_sys("SIG_BLOCK error"); //当前信号屏蔽字放在newmask里,以前的放在oldmask里 sleep(5); if(sigpending(&pendmask)<0) //保存所有被阻塞的信号,本例即保存SIGQUIT到pendmask中去 err_sys("sigpending error"); if(sigismember(&pendmask,SIGQUIT)) //测试SIGQUIT是否在信号掩码集pendmask中 err_sys("SIGQUIT pending"); if(sigprocmask(SIG_SETMASK,&oldmask,NULL)<0) //将信号屏蔽字恢复为原来的信号集 err_sys("SIG_SETMASK error"); printf("SIGQUIT unblocked"); sleep(5); exit(0); } static void sig_quit(int signo) { if(signal(SIGQUIT,SIG_DFL)==SIG_ERR) err_sys("can not reset SIGQUIT"); } 这个就是这几个函数的作用。通过实例来讲解,理解会更加明白一些 |