| 
                         执行命令: 
[cpp] view plaincopyprint? 01.第一个终端:   02.huangcheng@ubuntu:~$ ./a.out    03.第二个终端:   04.huangcheng@ubuntu:~$ kill -2 2682   05.huangcheng@ubuntu:~$ kill -2 2682   06.huangcheng@ubuntu:~$ kill -14 2682   07.huangcheng@ubuntu:~$ kill -14 2682   08.huangcheng@ubuntu:~$ kill -14 2682   09.huangcheng@ubuntu:~$ kill -14 2682   第一个终端: huangcheng@ubuntu:~$ ./a.out  第二个终端: huangcheng@ubuntu:~$ kill -2 2682 huangcheng@ubuntu:~$ kill -2 2682 huangcheng@ubuntu:~$ kill -14 2682 huangcheng@ubuntu:~$ kill -14 2682 huangcheng@ubuntu:~$ kill -14 2682 huangcheng@ubuntu:~$ kill -14 2682 
执行结果: 
[cpp] view plaincopyprint? 
01.huangcheng@ubuntu:~$ ./a.out 
02.catch SIGINT 
03.catch SIGINT 
04.sigwait, receive signal SIGALRM 
huangcheng@ubuntu:~$ ./a.out 
catch SIGINT 
catch SIGINT 
sigwait, receive signal SIGALRM结果说明:sigwait不会改变屏蔽字,仅仅是从未决队列中删除其等到的信号。 
示例代码3: 
[cpp] view plaincopyprint? 01.#include<stdio.h>    02.#include<pthread.h>    03.#include<signal.h>    04.   05.static void sig_alrm(int signo);   06.static void sig_init(int signo);   07.int   08.main()   09.{   10.    sigset_t set;   11.    int sig;   12.    sigemptyset(&set);   13.    sigaddset(&set, SIGALRM);   14.    pthread_sigmask(SIG_SETMASK, &set, NULL);//阻塞SIGALRM信号    15.       16.    signal(SIGALRM, sig_alrm);   17.    signal(SIGINT, sig_init);   18.    sigwait(&set, &sig);//sigwait只是从未决队列中删除该信号,并不改变信号掩码。也就是,当sigwait函数返回,它监听的信号依旧被阻塞。    19.    switch(sig){   20.    case 14:   21.        printf("sigwait, receive signal SIGALRMn");   22.        /*do the job when catch the sigwait*/   23.        break;   24.    default:    25.        break;   26.    }   27.    sigdelset(&set, SIGALRM);   28.    pthread_sigmask(SIG_SETMASK, &set, NULL);   29.   30.    for(;;)   31.    {}   32.    return 0;   33.}   34.   35.static void   36.sig_alrm(int signo)   37.{   38.    printf("after sigwait, catch SIGALRMn");   39.    fflush(stdout);   40.    return ;   41.}   42.   43.static void   44.sig_init(int signo)   45.{   46.    printf("catch SIGINTn");   47.    return ;   48.} 
#include<stdio.h> #include<pthread.h> #include<signal.h> static void sig_alrm(int signo); static void sig_init(int signo); int main() {     sigset_t set;     int sig;     sigemptyset(&set);     sigaddset(&set, SIGALRM);     pthread_sigmask(SIG_SETMASK, &set, NULL);//阻塞SIGALRM信号     signal(SIGALRM, sig_alrm);     signal(SIGINT, sig_init);     sigwait(&set, &sig);//sigwait只是从未决队列中删除该信号,并不改变信号掩码。也就是,当sigwait函数返回,它监听的信号依旧被阻塞。     switch(sig){     case 14:         printf("sigwait, receive signal SIGALRMn");         /*do the job when catch the sigwait*/         break;     default:          break;     }     sigdelset(&set, SIGALRM);     pthread_sigmask(SIG_SETMASK, &set, NULL);     for(;;)     {}     return 0; } static void sig_alrm(int signo) {     printf("after sigwait, catch SIGALRMn");     fflush(stdout);     return ; } static void sig_init(int signo) {     printf("catch SIGINTn");     return ; }                         (编辑:滁州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |