为什么在第 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 }
最佳答案
我认为困惑源于 signal()
: 这是一个简单地设置 handlerA
来处理 SIGUSR1
的函数。
到达时间线 22 时,信号未被调用,也未以任何方式触发任何处理程序。所以程序调用 fork()
和 count
从 0 增加到 1,正如预期的那样。
如果您还在 main
中的 fork 之前的某个地方 kill(pid, SIGUSR1);
,您将看到您期望的行为。
不要在该信号各自的处理程序中重新发出信号。
关于混淆 fork 和全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46578064/