子进程会继承父进程的数据结构吗?

4
在Linux中,如果父进程有任何数据结构(例如树、列表),这些数据结构是否会被子进程继承?我的意思是,子进程是否可以访问相同的数据结构(指向该数据结构的任何类型的指针)?
2个回答

9
如果您正在谈论 fork() 后的 Linux / Unix 进程,那么是的,它们会获得父进程数据的副本,因此其中一个进程在 fork 后所做的任何操作都不会被另一个进程看到(这通常通过写时复制来实现,因此内存页面在写入之前不会被复制,但用户程序看不到这个细节)。
如果您谈论的是使用 CreateProcess() 在 Windows 中启动新进程,则否,新进程不会继承任何来自父进程的数据结构。
两者更多地与您使用的操作系统有关,而不是与任何特定的编程语言有关。

(Linux)子进程会得到带有数据的数据结构的副本,还是只会得到它自己的新数据结构(例如树)? - user2831683
如果你说“它的新数据结构”指的是一个空树,而父节点的树已经有了一些条目 - 那么不是这样。子节点的数据空间是在 fork 时刻与父节点完全相同的副本。所以从某种意义上来说,它是一个新的数据结构,因为它是一个复制品,而不是原始版本。如果你修改了子进程的副本,父进程并不会察觉。但在 fork 之后,直到其中一个进程改变内容,数据结构的内容才会完全相同。 - Guntram Blohm
有没有办法让一个地方做出的更改在另一个地方反映出来? - user2831683
是的,例如如果您使用共享内存(man 2 shmget)或内存映射而没有设置MAP_PRIVATE标志(man 2 mmap)。 - Guntram Blohm

4
假设您正在使用类似于fork()的方法创建子进程,那么它们将继承实际父进程上下文中的所有全局内容,包括:
  • 环境变量设置
  • 打开的文件描述符
  • 等等。
全局作用域变量将从它们实际所在的状态被“复制”到子进程上下文中。对这些变量的更改不会在父进程中反映出来。
如果您想在父子进程之间通信,请考虑使用管道共享内存

是的,fork(); 子进程将具有对相同数据结构的访问权限,或者它将获得该数据结构的副本。 - user2831683
@user2831683 不要复制!只需要引用,访问此类数据时要注意竞态条件。 - πάντα ῥεῖ
所以,如果我在子进程中对数据结构进行了一些更改,那么这些更改也将影响父进程。 - user2831683
@user2831683 对不起,我对此有误导!全局进程数据将被复制到新的子进程上下文中,并且更改将不会被父进程看到。 - πάντα ῥεῖ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接