C 当fork()返回值存储在全局变量中时

C 当fork()返回值存储在全局变量中时,c,linux,operating-system,fork,C,Linux,Operating System,Fork,我正在研究fork(),正如我所了解的,在fork()中,父级和子级都有相同的“映像”,即它们都指向同一页表,其所有页表条目都标记为只读(当内核处理系统调用时)。当写入页面时,例如,更新变量时,会打开一个匿名页面,并将更改存储在该页面中,因此实际上子级和父级不会对彼此的变量产生影响。我遇到了一个奇怪的情况,我不知道发生了什么。我不明白的是,当返回的fork()值在静态变量中结束时会发生什么,以及何时进行拆分: #include <stdio.h> #include <sys/t

我正在研究fork(),正如我所了解的,在fork()中,父级和子级都有相同的“映像”,即它们都指向同一页表,其所有页表条目都标记为只读(当内核处理系统调用时)。当写入页面时,例如,更新变量时,会打开一个匿名页面,并将更改存储在该页面中,因此实际上子级和父级不会对彼此的变量产生影响。我遇到了一个奇怪的情况,我不知道发生了什么。我不明白的是,当返回的fork()值在静态变量中结束时会发生什么,以及何时进行拆分:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

static int a = 0;
static int r = 0;

int main() {
  r = fork();
  if (r > 0){
    a = 1;
  }
  if (a == 0) {
    fork();
  }
  return 0;
}
#包括
#包括
#包括
静态int a=0;
静态int r=0;
int main(){
r=fork();
如果(r>0){
a=1;
}
如果(a==0){
fork();
}
返回0;
}

执行了多少fork()?第一个显然发生了,第二个会发生吗?当我运行带有一些打印的代码(并且检查fork成功)时,它会从一个运行更改为另一个运行,尽管据我所知,它应该是始终是两个fork。我用来运行代码的计算机或程序是否有问题,或者我是否遗漏了什么,这种变化行为可以解释?

实际的分叉(包括复制父进程内存映射)发生在分配给
r
之前(它发生在
fork
函数内部,然后返回)。此程序确实应该始终执行
fork
2次(在原始进程中执行一次,在创建的第一个子进程中执行一次)。您如何确切地知道从一次运行到另一次运行的行为发生了变化?请小心打印输出。printf和company经常缓冲他们的输出,这可能会导致跨越forks的混乱行为;在分叉之前,您可能需要
fflush(stdout)
。此外,分叉进程同时运行。如果家长和孩子同时打印,打印输出的顺序会因运行而异。谢谢,printf确实弄乱了我的检查!我也不确定静态变量,虽然现在我看到它只意味着它们在初始化之前就被初始化了,但这并不意味着这些变量会像我之前怀疑的那样被子进程和父进程以某种方式共享。请阅读。由于没有显示插入指令的代码,我们无法判断其中发生了什么,但有几种方法可以让您获得令人困惑的信息。假设
fork()
没有失败,您应该有两个fork-无条件的一个,第一个
fork()
的子级将执行第二个
fork()