例如 环境变量 公共变量
代码地址: https://code.csdn.net/snippets/1697496.git
int glob_int = 1; /* on .data section */ int* ptr= new int[3];
[wang@localhost fork]$ ./a.out ptr index=0 value= 1 ptr index=1 value= 2 ptr index=2 value= 0 child pid = 25994, glob_int = 2 ptr=0x1c26010, ptr index=0 value= 3 ptr index=1 value= 4 ptr index=2 value= 0 parent pid = 25993, glob_int = 1 ptr=0x1c26010
Q1 为什么父子进程打印的ptr地址是一样的
A1: 现象如下父进程malloc的指针指向0x12345678, fork 后,子进程中的指针也是指向0x12345678,但是这两个地址都是虚拟内存地址 (virtual memory),经过内存地址转换后所对应的 物理地址是不一样的。
所以两个进程中的这两个地址相互之间没有任何关系。
(注1:在理解时,你可以认为fork后,这两个相同的虚拟地址指向的是不同的物理地址,这样方便理解父子进程之间的独立性) (注2:但实际上,linux为了提高 fork 的效率,采用了 copy-on-write 技术,fork后,这两个虚拟地址实际上指向相同的物理地址(内存页),只有任何一个进程试图修改这个虚拟地址里的内容前,两个虚拟地址才会指向不同的物理地址(新的物理地址的内容从原物理地址中复制得到))
虚拟地址里映射到真实的物理地址
fork 之后 父子进程之间什么样的数据是相同的?
不是 共享内存有持续性: 随内核, 即进程重启共享内存中数据不会丢失 本身不具备协作能力 需要互斥锁 信号量等完成
http://blog.csdn.net/xy010902100449/article/details/44851453
http://blog.csdn.net/cywosp/article/details/27316803
http://blog.csdn.net/ordeder/article/details/21716639 http://blog.csdn.net/sunmenggmail/article/details/7565337
http://www.cnblogs.com/zhaoyl/p/3695517.html http://blog.csdn.net/liuhongxiangm/article/details/8308291