功能分叉在操作系统中

时间:2014-02-15 07:23:27

标签: linux unix operating-system

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

1 个答案:

答案 0 :(得分:1)

进程ID的关系

成功完成后,fork()会向子项返回值0 处理并将子进程的进程ID返回给父进程 处理。否则,将值-1返回到父进程,否 创建子进程,并将全局变量errno设置为indi- 输入错误

堆或内存空间的关系

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

代码关系

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

C中的Fork'ing基本上是在它运行时被停止的进程,并且它的整个副本(有效地)在不同的内存空间中进行,然后两个进程被告知继续。他们将继续从父母暂停的地方继续。你可以告诉你进入哪个进程的唯一方法是检查fork()调用的返回值。

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

<强>堆栈

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