与分叉和全局变量混淆

时间:2017-10-05 04:51:04

标签: c multithreading fork

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

1 个答案:

答案 0 :(得分:4)

我认为混淆源于signal():这是一个只需设置handlerA来处理SIGUSR1的功能。

没有调用信号,也没有达到时间线22以任何方式触发的任何处理程序。因此,程序调用{​​{1}}和fork()从0增加到1,与预期的一样。

如果您在分叉之前的某个地方count kill(pid, SIGUSR1);,也会看到您期望的行为。

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