首页 文章

fork调用后的地址空间

提问于
浏览
1

当进程执行fork()sys调用时,会从中生成子进程 . fork()调用之后的所有代码都被复制到内存的新物理页面,即帧 . 我无法可视化子进程的虚拟内存部分 . 因为在下面的代码中,char变量的地址在child和parent中是相同的 .

#include <stdio.h>
#include <sys/types.h>

int main(void)
{
    pid_t pid;
    char y='Y';
    char *ptr;
    ptr=&y;
    pid = fork();
    if (pid == 0)
    {
        y='Z';
        printf(" *** Child process ***\n");
        printf(" Address is %p\n",ptr);
        printf(" char value is %c\n",y);
        sleep(5);
    }
    else
    {
        sleep(5);
        printf("\n ***parent process ***\n",&y);
        printf(" Address is %p\n",ptr);
        printf(" char value is %c\n",y);
    }
}

及其输出:

*** Child process ***
Address is 69002894
char value is Z

***parent process ***
Address is 69002894
char value is Y

2 回答

  • 5

    两个进程中的虚拟地址相同,但物理地址不同 . 您的进程只允许访问虚拟内存 . 在具有虚拟内存功能的机器中,内存管理单元将虚拟地址转换为物理地址 .

    通常,操作系统使用写时复制方案来实现分叉 . 这意味着它们将具有相同的物理地址,直到某些东西试图写入内存页面 . 当你把:

    y = 'Z'
    

    操作系统复制了y所在的内存页面,并将该虚拟地址重新分配给新的物理地址 .

  • 0

    根据我的说法,你运行'execve'命令后你会看到差异 . 在此之前,孩子与父母共享相同的图像和空间 .

相关问题