与分叉和全局变量混淆

问题描述:

为什么在第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

“已经修改”如何? – Ryan

+0

加2加1 – stumped

+0

或许'man 2 fork'“*子进程和父进程在不同的内存空间中运行。*”换句话说,“*子进程与父进程是完全相同的。 *“,但创建在一个单独的内存空间。所以它继承'fork'时的全局值,但不会被任何其他进程更新。 –

我觉得困惑从signal()而产生:它是简单地设置handlerA处理SIGUSR1功能。

该信号未被调用,也没有任何处理器以任何方式被时间线22触发。所以程序调用fork()count增量从0到1,如预期。

如果您还在mainmain之前的某处发现了叉,您会看到您期待的行为。

不要在该信号各自的处理程序内重新提升信号。