3

可能重复:
分叉后,全局变量是否共享?

在我的 C 程序中,我将结构链表作为全局变量。然后我分叉了一个子进程。现在在子进程中如果我释放链表的一个节点,然后结束子进程。节点也会在父进程中消失吗?

当我尝试这个时,似乎节点仍然存在于父进程中......这是对的吗?为什么?

4

3 回答 3

9

不,它不会在父进程中消失。正确的心智模式是孩子正在获得父母记忆的独立副本。这两个进程不共享内存(除非您明确设置共享内存段并将数据放在那里)。

如果你使用线程而不是进程,情况就完全不同了。在同一进程中运行的线程确实共享地址空间。

于 2013-01-23T21:11:39.717 回答
2

fork(2)创建父虚拟地址空间的副本struct,因此除非您将这些s 放入共享内存中,否则它们是完全不相关的。

于 2013-01-23T21:13:04.913 回答
1

是的,它按预期工作,您不能从孩子(或来自父母的孩子)修改父母

这两个进程(父进程和子进程)是两个不同的进程,就像您的一个进程无法写入内存一样,例如,也在您的机器上运行的网络服务器,父进程无法写入子进程,反之亦然。

为了避免将父进程中的所有内容复制到子进程中,操作系统使用了一种称为“写时复制”的东西,其工作原理如下:当创建“子”进程时,代表父进程的页面被复制,并标记为“只读”。当发生写入时,操作系统会捕获该写入(这是不允许的,因为内存是只读的),并制作内存的副本,以便写入内存的进程作为它自己的内存副本 [并取消标记另一个进程上的“只读”,因此它现在可以修改数据,因为它具有原始内存内容]。

正如其他人所说,您可以通过使用“共享内存”(如果您愿意,也可以在完全独立的进程之间共享)来克服这个问题。

于 2013-01-23T21:17:08.873 回答