混淆 fork 和全局变量

标签 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   }

最佳答案

我认为困惑源于 signal() : 这是一个简单地设置 handlerA 来处理 SIGUSR1 的函数。

到达时间线 22 时,信号未被调用,也未以任何方式触发任何处理程序。所以程序调用 fork()count 从 0 增加到 1,正如预期的那样。

如果您还在 main 中的 fork 之前的某个地方 kill(pid, SIGUSR1);,您将看到您期望的行为。

不要在该信号各自的处理程序中重新发出信号。

关于混淆 fork 和全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46578064/

相关文章:

linux - 父子之间的信号和 C 中的 fork

c - 如何在 SIGINT 上仅终止前台子进程?

c - 结构成员对齐——使用 16 位和 32 位编译器的不同 sizeof

c - C 中 free() 函数的问题

c - 用C函数获取字符串

c - C中两个数组的交集函数

c# - 您如何通知父线程所有子线程都已终止?

android - 工作线程与主线程通信

java - 执行器停止所有正在运行的任务并重新运行

c - 对 execvp() 的调用内部重定向不起作用