加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_宿迁站长网 (https://www.0527zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

UNIX环境高级编程:线程和信号

发布时间:2016-01-15 12:31:11 所属栏目:Unix 来源:网络整理
导读:每个线程都有自己的信号屏蔽字,但是信号的处理是进程中所有线程共享的。这意味着尽管单个线程可以阻止某些信号,但当线程修改了与某个信号相关的处理行为以后

执行命令:

[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 ;
}

(编辑:云计算网_宿迁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读