我只是不明白为什么这段代码会这样工作(而不是我期望的):
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
int main()
{
int buffer;
int* address;
address=&buffer;
if(fork()==0)
{
*address=27;
printf("Address %ld stores %d\n",(long)address,*address);
exit(0);
}
wait(NULL);
printf("Address %ld stores %d\n",(long)(&buffer),buffer);
return 0;
}
为什么系统存储不同的变量,即使它们指向相同的内存地址?
注意:我从来没有真正期望这段代码能够工作,因为否则整堆管道和东西就没有任何意义;我只是想了解这里发生了什么事。
这实际上并不是一个 C 问题,而是关于(现代)操作系统的行为。
简而言之:现代操作系统上的用户空间程序在某些私有空间中运行virtual地址空间。当访问内存时,虚拟地址被转换为物理地址。实际内存和虚拟地址空间之间的映射是由操作系统设置的——内存被分为页面,页面可以“映射”到进程的地址空间。
fork()
通常只是将相同的内存映射到它创建的第二个进程,但是一旦写入该内存,就会复制该页面并映射该副本(“写入时复制”)。用户空间程序永远不会看到其他用户空间程序私有的内存。
我相信您可以通过搜索此答案中给出的关键词轻松找到更多详细信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)