关于fork的不解之处

来源:互联网 发布:fw190d13数据 编辑:程序博客网 时间:2024/05/17 01:16

看到一段代码如下:

#include <stdio.h>#include <sys/types.h>#include <unistd.h>struct con {         int a; }; int main() {         pid_t pid;         struct con s;         s.a = 2;         struct con* sp = &s;         pid = fork();         if (pid > 0) {                 printf("parent show %p, %p, a =  %d\n", sp, &sp->a, sp->a);                 sp->a = 1;                 sleep(10);                 printf("parent show %p, %p, a = %d\n", sp, &sp->a, sp->a);                 printf("parent exit\n");        }         else {                 printf("child show %p, %p, a = %d\n", sp, &sp->a, sp->a);                 sp->a = -1;                 printf("child change a to %d\n", sp->a);         }         return 0; }


执行结果为:

parent show 0x7fff47720cc0, 0x7fff47720cc0, a =  2
child show 0x7fff47720cc0, 0x7fff47720cc0, a = 2
child change a to -1
parent show 0x7fff47720cc0, 0x7fff47720cc0, a = 1
parent exit

为什么不同进程变量的虚拟地址相同?应该不同的,因为它们的值改变互不影响。

不解啊


新解释:不同地址有各自独立的虚拟内存,进程间不能互相访问对方的虚拟地址。fork后的子进程与父进程有同样的页表信息。取地址只能取到虚拟地址,不能取到物理地址。

0 0
原创粉丝点击