gpt4 book ai didi

linux - 操作系统中的函数叉

转载 作者:太空宇宙 更新时间:2023-11-04 05:44:49 25 4
gpt4 key购买 nike

这是我的问题:如果一个进程(父进程)使用 fork() 创建一个新进程(子进程),那么父子进程之间不共享哪些数据结构?-进程ID-堆-代码-堆栈

最佳答案

进程 ID 的关系

成功完成后,fork() 向子进程返回 0 值进程并将子进程的进程ID返回给父进程过程。否则,返回-1值给父进程,不创建子进程,并将全局变量 errno 设置为独立的找出错误

堆或内存空间的关系

子级获得父级地址空间的精确副本,在许多情况下,该副本可能以与父级地址空间相同的格式进行布局。我必须指出,每个内存都将拥有自己的虚拟地址空间,这样每个内存都可以在同一地址但在不同的地址空间中具有相同的数据。另外,Linux 在创建子进程时使用写时复制。这意味着父进程和子进程将共享父地址空间,直到其中一个进行写入操作,此时内存将被物理复制到子进程。这消除了执行新进程时不需要的副本。既然您只是用新的可执行文件覆盖内存,为什么还要费心复制它呢?

代码关系

C 中没有面向对象的继承。

C 中的 fork 基本上是进程在运行时被停止,并在(有效地)不同的内存空间中创建它的整个副本,然后两个进程都被告知继续。他们都将从父级暂停的地方继续。判断当前所处进程的唯一方法是检查 fork() 调用的返回值。

在这种情况下,子进程并没有真正继承父进程的所有内容,而更像是获得父进程拥有的所有内容的完整副本。

堆栈

子进程获取父进程中声明的全局变量的单独实例”。分离进程的目的是分离内存。因此,一旦发生 fork,父进程和子进程就无法共享变量。

关于linux - 操作系统中的函数叉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21794656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com