首页 文章

fork()和地址空间[暂停]

提问于
浏览
1

如果调用执行子代码的函数会发生什么?父进程的地址空间被复制,但不能使用父进程的本地变量 . 我知道当使用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;
}

1 回答

  • 1

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

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

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

相关问题