全局变量是否对子进程和父进程是静态的?

时间:2013-01-23 21:10:07

标签: c linux

  

可能重复:
  After forking, are global variables shared?

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

当我尝试这个时,似乎节点仍在父进程中... 这是正确的吗?为什么呢?

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

这两个进程(父进程和子进程)是两个不同的进程,就像你的一个进程无法写入内存,比如一个也在你的机器上运行的web服务器,父进程可以'写入子进程,反之亦然。

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

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