tmp.c
(1.0 K)
练习APUE上面一个利用信号同步的一个例子,发现SIGURS1只能捕捉一次,我把问题简化后,代码是这样的:
1 #include "apue.h"
2 static volatile sig_atomic_t sigflag=0; /* set nonzero by sig handler */
3 static sigset_t newmask, oldmask, zeromask;
4 static void sig_usr(int signo)
5 {
6 sigflag = 1;
7 }
8
9 void TELL_WAIT(void)
10 {
11 if (signal(SIGUSR1, sig_usr) == SIG_ERR)
12 err_sys("signal(SIGUSR1) error");
13 sigemptyset(&zeromask);
14 sigemptyset(&newmask);
15 sigaddset(&newmask, SIGUSR1);
16 if (sigprocmask(SIG_BLOCK, &newmask, &oldmask)
17 err_sys("SIG_BLOCK error");
18 }
19
20 void WAIT(void)
21 {
22 while (sigflag == 0)
23 sigsuspend(&zeromask);
24 sigflag = 0;
25 if (sigprocmask(SIG_SETMASK, &oldmask, NULL)
26 err_sys("SIG_SETMASK error");
27 }
28
29 int main()
30 {
31 int value = 0, fd;
32 pid_t pid;
33 FILE *fp;
34 fp=stdout;
35 setbuf(fp, NULL);
36 TELL_WAIT();
37 for (int i = 0; i
38 WAIT();
39 fprintf(fp, "parent : %d\n", value++);
40 }
41 exit(0);
42 }
然后编译成 a.out。
我想每次发送一个信号后,进程输出一个自增的数,下面是过程:
$ ./a.out &
[1] 3164
$ kill -USR1 3164
parent : 0
$ kill -USR1 3164
[1]+ User defined signal 1 ./a.out
我的问题是:为什么 SIGURS1 只能捕捉一次?我练习其他的程序时 SIGURS1 都是可以重复捕捉的,handler 不用重新注册
望赐教,非常感谢!