【问题标题】:Confusion with forking and global variables混淆分叉和全局变量
【发布时间】: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


【解决方案1】:

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

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

如果您在分叉前的某个位置也将kill(pid, SIGUSR1); 放在main 中,您会看到您所期望的行为。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多