期待的效果是,
./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: