gpt4 book ai didi

c - 为什么子进程和父进程的变量地址相同

转载 作者:太空狗 更新时间:2023-10-29 16:58:00 25 4
gpt4 key购买 nike

这是我的代码

int main()
{
pid_t pid;
int y = 3;
if ( (pid = fork()) <0 )
return -1;;

if( pid == 0 ) /* child */
{
printf(" before: %d %p\n", y, &y );
y *= 10;
printf("after: %d %p\n", y, &y );
}
else /* father */
{
sleep(1);
printf("father: %d %p\n" , y , &y );

}
return 0;
}

程序的输出如下:

before: 3 ffbff440
after: 30 ffbff440
father: 3 ffbff440

我的问题是为什么子变量和父变量的地址相同但值不同?

最佳答案

因为它是一个虚拟地址,而不是物理地址。

每个进程都有自己的地址空间(例如,32位系统可能允许每个进程都有自己的地址空间,范围是4G)。

它是将虚拟地址映射到物理地址的内存管理单元(如果换出的页面需要从辅助存储中买回,则处理诸如页面错误之类的事情)。

下图可能会有帮助,每个部分代表一个 4K 内存块:

   Process A           Physical Memory      Process B
+-------+ +-------------+ +-------+
0K | |----> 0K | (shared) | <----| | 0K
+-------+ +-------------+ +-------+
4K | |--+ 4K | | <----| | 4K
+-------+ | +-------------+ +-------+
8K | | +-> 8K | | | | 8K
+-------+ +-------------+ +-------+
| : : : : : : : |
| +-------------+ |
| 128K | | <--------+
| +-------------+
+--------> 132K | |
+-------------+

您可以在该图中看到虚拟内存地址和物理内存地址之间的断开连接(以及进程共享内存块的可能性)。左右两侧的地址是进程看到的虚拟地址。

中央 block 中的地址是数据“真正”所在的实际物理地址,MMU 处理映射。

要更深入地了解 fork(和 exec),您可能还想看看 this answer .

关于c - 为什么子进程和父进程的变量地址相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7253659/

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