gpt4 book ai didi

c - 使用 fork 创建的新进程,但为变量打印相同的地址

转载 作者:太空宇宙 更新时间:2023-11-04 00:16:11 24 4
gpt4 key购买 nike

我有以下代码:

#include<stdio.h>
#include<unistd.h>
int main()
{
int a=0;
printf("before: %d %p\n",a,&a);
int t=fork();
if(t==0)
{
a=a+5;
printf("child: %d %p\n",a,&a);
}
else
{
a=a+10;
printf("parent: %d %p\n",a,&a);
}
//printf("both: %d %p\n",a,&a);
return 0;
}

为什么所有的地址都打印一样?我认为调用 fork 时会创建变量的新副本。跟虚拟地址和物理地址有关系吗?如果是这样,同一个虚拟地址如何映射到不同的物理地址?

最佳答案

地址是相同的,因为每个 process ( parent 和 child )有自己的 virtual address space . Linux 计算机有 virtual memory (由内核和处理器提供)。

fork system call就是“神奇地”将父进程的虚拟地址空间复制到子进程的虚拟地址空间中(fork的结果除外)。此复制使用惰性 copy-on-write技术因此非常有效。内核正在管理 MMU (用于虚拟内存和实现各个虚拟地址空间)

阅读Advanced Linux Programming (它有几个相关的章节)&仔细fork(2) .

顺便说一句,养成调用 fflush(NULL); before fork 的习惯。参见 fflush(3) .

关于c - 使用 fork 创建的新进程,但为变量打印相同的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38787997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com