Fork()和全局变量

时间:2018-01-05 16:34:34

标签: c fork

我知道当两个变量具有相同的地址时,它们将具有相同的值,但在我的情况下,var“a”在fork之后的子进程和父进程中具有相同的地址但是当我在子进程中设置a = 1时在父亲过程中的价值保持5 ...为什么?并谢谢

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int a = 5;

int main(int argc, char const *argv[]) {

  pid_t pid;
  pid = fork();
  if (pid == -1) {
    printf("%s\n", " erreur while creating fils !");

  } else if (pid == 0){
      a = 1;
      printf("%s %d\n", "child", a);
      printf("%s %p\n", "child", &a);
      return printf("child done\n");
  } else {
    wait(0);
    printf("%s %d\n", "father", a);
    printf("%s %p\n", "father", &a);
    return printf("father done\n");
  }

}

3 个答案:

答案 0 :(得分:2)

当您进行分叉时,该子进程将成为父进程的 副本 。子进程中变量的副本与父进程中的变量完全断开。

答案 1 :(得分:2)

fork()之后,父子进程有不同的地址空间。

enter image description here

即使您使用全局变量,它也会被复制。当您尝试更改它时,其副本值会更改。

  

他们仍然拥有相同的内存地址..为什么?

物理内存与进程的虚拟地址空间之间存在脱节。它似乎是相同的内存地址,只有虚拟地址。更多信息,4G address space and mapping

答案 2 :(得分:0)

使用fork时,会创建一个不与第一个共享内存的不同进程。

(你可以看到线程)