Linux信號有多種說法。一個進程創(chuàng)建一個信號用于發(fā)送給另外一個進程叫做發(fā)送一個信號,內(nèi)核創(chuàng)建一個信號叫做生成一個信號,進程自己向自己發(fā)送信號叫做喚起一個信號。不過我看也沒必要這么學(xué)究氣。 信號集--signel set,其實就是將多個信號放在集合中進行集中的處理。POSIX.1定義了sigset_t以包涵一個信號集,并且定義了五個處理信號的函數(shù): 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); 還有一個重要的函數(shù):int sigprocmask(int how,const sigset_t *restrict set,sigset_t *restrict oset); 單純講這些函數(shù)很難講明白,下面結(jié)合程序來講,程序來自UNIX環(huán)境高級編程: static void sig_quit(int); //信號處理函數(shù) 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) //將信號屏蔽字恢復(fù)為原來的信號集 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"); } 這個就是這幾個函數(shù)的作用。通過實例來講解,理解會更加明白一些 |