使用sigsuspend函数捕捉到信号改变变量的值。
2015-12-17 16:45
281 查看
期待的效果是,
./jump_out_while
^Cinterrupt
^Cinterrupt
^Cinterrupt
^Cinterrupt
^\catch SIGQUIT
然而是确实这样:(知道到为什么只能只是一次调用自己的handler函数。)
<bldc:/home/tingbinz/apue.3e/SBSCODE/10>R*_*G:./jump_out_while
^Cinterrupt
^\catch SIGQUIT
<bldc:/home/tingbinz/apue.3e/SBSCODE/10>R*_*G:./jump_out_while
^Cinterrupt
^C<bldc:/home/tingbinz/apue.3e/SBSCODE/10>R*_*G:./jump_out_while
^Cinterrupt
^C<bldc:/home/tingbinz/apue.3e/SBSCODE/10>R*_*G:
源代码:
<bldc:/home/tingbinz/apue.3e/SBSCODE/10>R*_*G:cat -n 10_23.c
1 #include "apue.h"
2
3 volatile sig_atomic_t quitflag;
4
5 static void sig_int (int signo)
6 {
7 if (signo == SIGINT){
8 printf("interrupt\n");
9 }
10 else if (signo == SIGQUIT){
11 quitflag = 1;
12 printf("catch SIGQUIT\n");
13 }
14 }
15
16 int main()
17 {
18 sigset_t new_mask, old_mask, empty_mask;
19
20 if (signal(SIGINT,sig_int) == SIG_ERR)
21 printf("signal SIGINT error");
22
23 if (signal(SIGQUIT,sig_int) == SIG_ERR)
24 printf("signal SIGQUIT error");
25
26 sigemptyset(&empty_mask);
27 sigemptyset(&new_mask);
28 sigaddset(&new_mask,SIGQUIT);
29
30 if (sigprocmask(SIG_BLOCK,&new_mask,&old_mask) < 0)
31 err_sys("SIG_BLOCK error");
32
33 while (quitflag == 0 )
34 sigsuspend(&empty_mask);
35
36 quitflag = 0;
37 if (sigprocmask(SIG_SETMASK,&old_mask,NULL) < 0)
38 err_sys("sigprocmask SIG_SETMASK error");
39
40 exit(0);
41 }
<bldc:/home/tingbinz/apue.3e/SBSCODE/10>R*_*G:
./jump_out_while
^Cinterrupt
^Cinterrupt
^Cinterrupt
^Cinterrupt
^\catch SIGQUIT
然而是确实这样:(知道到为什么只能只是一次调用自己的handler函数。)
<bldc:/home/tingbinz/apue.3e/SBSCODE/10>R*_*G:./jump_out_while
^Cinterrupt
^\catch SIGQUIT
<bldc:/home/tingbinz/apue.3e/SBSCODE/10>R*_*G:./jump_out_while
^Cinterrupt
^C<bldc:/home/tingbinz/apue.3e/SBSCODE/10>R*_*G:./jump_out_while
^Cinterrupt
^C<bldc:/home/tingbinz/apue.3e/SBSCODE/10>R*_*G:
源代码:
<bldc:/home/tingbinz/apue.3e/SBSCODE/10>R*_*G:cat -n 10_23.c
1 #include "apue.h"
2
3 volatile sig_atomic_t quitflag;
4
5 static void sig_int (int signo)
6 {
7 if (signo == SIGINT){
8 printf("interrupt\n");
9 }
10 else if (signo == SIGQUIT){
11 quitflag = 1;
12 printf("catch SIGQUIT\n");
13 }
14 }
15
16 int main()
17 {
18 sigset_t new_mask, old_mask, empty_mask;
19
20 if (signal(SIGINT,sig_int) == SIG_ERR)
21 printf("signal SIGINT error");
22
23 if (signal(SIGQUIT,sig_int) == SIG_ERR)
24 printf("signal SIGQUIT error");
25
26 sigemptyset(&empty_mask);
27 sigemptyset(&new_mask);
28 sigaddset(&new_mask,SIGQUIT);
29
30 if (sigprocmask(SIG_BLOCK,&new_mask,&old_mask) < 0)
31 err_sys("SIG_BLOCK error");
32
33 while (quitflag == 0 )
34 sigsuspend(&empty_mask);
35
36 quitflag = 0;
37 if (sigprocmask(SIG_SETMASK,&old_mask,NULL) < 0)
38 err_sys("sigprocmask SIG_SETMASK error");
39
40 exit(0);
41 }
<bldc:/home/tingbinz/apue.3e/SBSCODE/10>R*_*G:
相关文章推荐
- Win8在哪里设置图片的密码?
- CocoaPods安装Alamofire Xcode7.1
- EJB面试题
- 3192: [JLOI2013]删除物品
- LZW压缩算法
- Linux指令--mv
- redis初探
- Spring 配置log4j和简单介绍Log4J的使用
- Linux指令--mv
- Cocos2dx 3.0 交流篇
- 浏览器下载文件
- 代码:cookie(一个广告展示例子)
- mysql 去除重复记录
- 欢迎使用CSDN-markdown编辑器
- 图片验证码生成
- HTML5知识介绍
- 转:Python模块——struct(字节流,组包拆包实现)
- win10系统Powershell重置应用失效的解决办法
- TCP/IP、Http、Socket的区别
- 用viewpager+fragment实现仿华为自定义铃声