| 执行命令: 
[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 ;
 }
 (编辑:源码网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |