【发布时间】:2018-03-16 15:02:14
【问题描述】:
为什么在第 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 }
【问题讨论】:
-
“已经修改”怎么办?
-
已经增加了 2
-
也许
man 2 fork"子进程和父进程运行在不同的内存空间中。" 换句话说,"子进程是父进程...”,但在单独的内存空间中创建。所以它继承了fork时全局的值,但此后没有被任何其他进程更新。 -
所以你认为
handlerA在那个时候被调用了?怎么样? -
@Superman 哦,既然它是异步的,那是否意味着计数可能是 0 或 2?
标签: c multithreading fork