sleep2函數調用龍jmp使得另外一個信號處理函數sig_int提早終止。
一、源代碼:
cat -n 10_8.c 10_9.c
1 #include <setjmp.h>
2 #include <signal.h>
3 #include <unistd.h>
4
5 static jmp_buf env_alrm;
6
7 static void sig_alrm(int sign0)
8 {
9 longjmp(env_alrm,1);
10 }
11
12 unsigned int sleep2(unsigned int seconds)
13 {
14 if (signal(SIGALRM,sig_alrm) == SIG_ERR){
15 return(seconds);
16 }
17 if (setjmp(env_alrm) == 0){
18 alarm(seconds);
19 pause();
20 }
21
22 return((alarm(0)));
23 }
1 #include "apue.h"
2
3 unsigned int sleep2(unsigned int);
4 static void sig_int(int sig_no);
5
6 int main()
7 {
8 unsigned int unslept;
9
10 if (signal(SIGINT,sig_int) == SIG_ERR){
11 err_sys("signal(SIG_INT) error");
12 }
13
14 unslept = sleep2(5);
15 printf("sleep2(5) unslept time is:%d\n",unslept);
16 return 0;
17 }
18
19
20 static void sig_int (int sig_no)
21 {
22 int j,i;
23 volatile int k;
24 printf("sig_int started\n");
25 for (i=0; i != 300000; ++i)
26 for (j = 0; j != 40000; ++j)
27 k += j*i;
28 printf("sig_int finished\n");
29 }
二、編譯及運行結果:
gcc -Wall -ggdb3 10_8.c 10_9.c -o problemed_sleep
In file included from apue.h:132,
from 10_9.c:1:
error.c: In function `err_doit':
error.c:121: warning: implicit declaration of function `vsnprintf'
error.c:123: warning: implicit declaration of function `snprintf'
<bldc:/home/tingbinz/apue.3e/SBSCODE/10>R*_*G:./problemed_sleep
^Csig_int started
sleep2(5) unslept time is:0