C Fork()与全局变量

C Fork()与全局变量,c,fork,C,Fork,我知道当两个变量有相同的地址时,它们会有相同的值,但在我的例子中,变量“a”在fork之后的子进程和父进程中有相同的地址。。但当我在子进程中设置a=1时,父进程中a的值保持在5。。。为什么?谢谢 #包括 #包括 #包括 INTA=5; int main(int argc,char const*argv[]{ pid_t pid; pid=fork(); 如果(pid==-1){ printf(“%s\n”,“创建文件时出错!”); }否则如果(pid==0){ a=1; printf(“%s%

我知道当两个变量有相同的地址时,它们会有相同的值,但在我的例子中,变量“a”在fork之后的子进程和父进程中有相同的地址。。但当我在子进程中设置a=1时,父进程中a的值保持在5。。。为什么?谢谢


#包括
#包括
#包括
INTA=5;
int main(int argc,char const*argv[]{
pid_t pid;
pid=fork();
如果(pid==-1){
printf(“%s\n”,“创建文件时出错!”);
}否则如果(pid==0){
a=1;
printf(“%s%d\n”,“子”,a);
printf(“%s%p\n”、“子项”和(&a);
返回printf(“子项完成\n”);
}否则{
等待(0);
printf(“%s%d\n”,“父”,a);
printf(“%s%p\n”、“父项”&a);
返回printf(“父亲完成”\n);
}
}

分叉时,子进程将成为父进程的副本。子进程中变量的副本与父进程中的变量完全断开连接。

分叉时,子进程将成为父进程的副本。子进程中变量的副本与父进程中的变量完全断开连接。

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


(你可以看到线程)

当你使用fork时,你创建了一个不同的processus,它不与第一个processus共享内存


(您可以看到线程)

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

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

它们仍然具有相同的内存地址。。为什么?


物理内存和进程的虚拟地址空间之间存在断开连接。这里似乎有相同的内存地址,那只是虚拟地址。有关更多信息,请参见父进程和子进程在
fork()之后有不同的地址空间

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

它们仍然具有相同的内存地址。。为什么?


物理内存和进程的虚拟地址空间之间存在断开连接。这里似乎有相同的内存地址,那只是虚拟地址。要了解更多信息,请将内存地址虚拟化。仅仅因为它们返回相同的虚拟地址,它们并不指向相同的物理内存。在
fork()
之后,父进程和子进程是在不同内存块中运行的不同进程。父进程的所有数据都复制到子进程中。添加到@axiac answer中,Linux将执行延迟复制以节省内存,这意味着一旦一个进程尝试修改数据,就会发生复制
fork
调用复制进程/地址空间:之后两个进程是两个不同的,孤立的实体。因此,如果您在fork之前的父级中更改
a
,您会在子级中看到
a
的副本,但是如果您在子级中更改
a
(因此在
fork
之后),这是另一个地址空间中的对象。内存地址被虚拟化。仅仅因为它们返回相同的虚拟地址,它们并不指向相同的物理内存。在
fork()
之后,父进程和子进程是在不同内存块中运行的不同进程。父进程的所有数据都复制到子进程中。添加到@axiac answer中,Linux将执行延迟复制以节省内存,这意味着一旦一个进程尝试修改数据,就会发生复制
fork
调用复制进程/地址空间:之后两个进程是两个不同的,孤立的实体。因此,如果您在fork之前的父级中更改
a
,您会在子级中看到
a
的副本,但如果您在子级中更改
a
(因此在
fork
之后)这是一个位于不同地址空间的对象。是的,我知道,但为什么它们有相同的地址和不同的值??它们有相同的地址,因为它们使用虚拟地址用于您的操作系统它们不是相同的地址是的,我知道,但为什么它们有相同的地址和不同的值??它们有相同的地址,因为它们使用虚拟地址操作系统的地址它们不是相同的地址,但它们仍然具有相同的内存地址。。为什么?@ÀbdøGh这是复制的一部分。但是它们仍然有相同的内存地址。。为什么?@ÀbdøGh这是复制的一部分。请注意(虚拟)地址在子级中必须保持不变,否则其中的每个指针值都将不可用。请注意(虚拟)地址在子级中必须保持不变,否则其中的每个指针值都将不可用。
#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");
  }

}