我知道当两个变量具有相同的地址时,它们将具有相同的值,但在我的情况下,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");
}
}
答案 0 :(得分:2)
当您进行分叉时,该子进程将成为父进程的 副本 。子进程中变量的副本与父进程中的变量完全断开。
答案 1 :(得分:2)
在fork()
之后,父子进程有不同的地址空间。
即使您使用全局变量,它也会被复制。当您尝试更改它时,其副本值会更改。
他们仍然拥有相同的内存地址..为什么?
物理内存与进程的虚拟地址空间之间存在脱节。它似乎是相同的内存地址,只有虚拟地址。更多信息,4G address space and mapping
答案 2 :(得分:0)
使用fork时,会创建一个不与第一个共享内存的不同进程。
(你可以看到线程)