繁体   English   中英

与分叉和全局变量混淆

[英]Confusion with forking and global variables

为什么在第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,如预期的那样。

如果您同时kill(pid, SIGUSR1);您将看到预期的行为kill(pid, SIGUSR1); main叉在什么地方。

不要在该信号的相应处理程序内重新引发该信号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM