2014-03-01 56 views
1

在Linux中,如果父进程具有任何数据结构(例如,树,列表),那么子进程继承的是那些数据结构?我的意思是,孩子是否可以访问相同的数据结构(指向该数据结构的任何类型的指针)?子进程是否继承父进程的数据结构?

回答

4

如果您在讨论fork()之后的Linux/Unix进程,是的。他们得到他们自己的父进程的数据副本,所以无论他们中的哪一个在fork之后都看不到另一个(通常通过写时复制来实现),所以内存页不会被复制,直到写入,但这是用户程序没有看到的细节)。

如果您在谈论Windows启动一个新进程CreateProcess(),否,新进程不会从父进程继承任何数据结构。


这两者都与您使用的操作系统有关,而不是使用任何特定的编程语言。

+0

(linux),子进程获取数据结构的副本还是获取数据结构的新数据结构(例如树)。 – user2831683

+0

如果用“其新数据结构”表示一棵空树,而父树有一些条目 - 不。孩子的数据空间是分岔时父母的数据空间的精确副本。所以这是一个新的数据结构,因为它是一个副本,而不是原始数据结构,如果您修改子进程的副本,那么父进程不会注意到。但是,在fork之后,其中一个进程会更改内容,数据结构的内容将完全相同。 –

+0

是否有任何方法可以使其中的更改反映在另一个 – user2831683

2

假设你正在使用类似fork()创建子进程,他们会继承一切的全球对实际父进程的背景:

  • 设置环境变量
  • 打开文件描述符
  • 等等

全局范围变量将复制给孩子pr从他们实际所在的状态中获取背景。将这些变量的变化不会在中体现出来。

如果要在父级和子级进程之间进行通信,请考虑使用pipesshared memory

+0

yes fork();子进程将访问相同的数据结构,否则它将获得该数据结构的副本 – user2831683

+0

@ user2831683没有副本!只需参考,在访问此类数据时应注意竞争条件。 –

+0

因此,如果我在子进程中对数据结构进行一些更改,那么这些更改也将用于父进程 – user2831683