与分叉和全局变量混淆
问题描述:
为什么在第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
的main
之前的某处发现了叉,您会看到您期待的行为。
不要在该信号各自的处理程序内重新提升信号。
“已经修改”如何? – Ryan
加2加1 – stumped
或许'man 2 fork'“*子进程和父进程在不同的内存空间中运行。*”换句话说,“*子进程与父进程是完全相同的。 *“,但创建在一个单独的内存空间。所以它继承'fork'时的全局值,但不会被任何其他进程更新。 –