为什么第22行打印会导致1而不是3? count
是一个全局变量,它已在handlerA中修改过,为什么它不在第21行和第22行保留其值?
1 pid_t pid;
2 int count = 0;
3
4 void handlerA(int sig) {
5 count += 2
6 printf("count = %d\n", count);
7 fflush(stdout);
8 kill(pid, SIGUSR1);
9 }
10
11 void handlerB(int sig) {
12 count += 3;
13 printf("count = %d\n", count);
14 fflush(stdout);
15 exit(0);
16 }
17
18 int main() {
19 signal(SIGUSR1, handlerA);
20 if ((pid = fork()) == 0) {
21 count++;
22 printf("count = %d\n", count);
23 fflush(stdout);
24 signal(SIGUSR1, handlerB);
25 kill(getpid(), SIGUSR1);
26 while (1) {};
27 }
28 else {
29 wait();
30 count += 4;
31 printf("count = %d\n", count);
32 fflush(stdout);
33 }
34 return 0;
35 }
答案 0 :(得分:4)
我认为混淆源于signal()
:这是一个只需设置handlerA
来处理SIGUSR1
的功能。
没有调用信号,也没有达到时间线22以任何方式触发的任何处理程序。因此,程序调用{{1}}和fork()
从0增加到1,与预期的一样。
如果您在分叉之前的某个地方count
kill(pid, SIGUSR1);
,也会看到您期望的行为。
不要重新提升该信号各自处理程序内的信号。