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