首页 > 解决方案 > fork() 和地址空间

问题描述

如果调用执行子代码的函数会发生什么?父进程的地址空间被复制,但不能使用父进程的局部变量。我知道在使用 fork() 时,地址空间仅在子进程或父进程中进行写入时才会被复制,因此如果在父进程中进行了写入,那么子进程将获得父地址空间的副本。可以将子代码放在单独的函数中吗?

void child(){
    //do something
}
int main(int argc, char const *argv[])
{
    int x = 0;
    int pid;
    if((pid=fork()) < 0){
        printf("error\n");
        exit(1);
    }
    if(pid==0){
        child();
    }
    x=12;
    return 0;
}

标签: clinuxfork

解决方案


孩子获得了父母地址空间的完整副本。所以孩子可以访问由父母创建的指针,但只能访问在fork(). 在 fork 之后,出于所有编程目的,每个进程都有一个父进程内存的副本。因此,父(或子)的更改被限制在他们自己的块中。

例如,假设父级有一个指向字符缓冲区的指针。parent fork()s,所以现在 parent 和 child 都包含指向同一个块的相同指针。如果父进程或子进程更改该缓冲区,则其他进程不会看到更改。在硬件级别,内存块将位于其他位置。该进程在虚拟地址空间中运行,因此当两个程序内存块发生更改时,将为每个进程复制这部分内存(以及整个页面)。

将子代码放在函数中是没有问题的,实际上这是一个好主意。


推荐阅读