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

UNIX情形高级编程:线程和信号

发布时间:2016-10-29 22:06:49 所属栏目:Unix 来源:站长网
导读:副标题#e# 每个 线程 都有自己的 信号 屏蔽字,但是 信号 的处理是进程中所有 线程 共享的。这意味着尽管单个线程可以阻止某些信号,但当线程修改了与某个信号相关的处理行为以后,所有的线程都必须共享这个处理行为的改变。这样如果一个信号选择忽略某个信

示例代码2:

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

(编辑:温州站长网)

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

热点阅读