可能重复:
分叉后,全局变量是否共享?
在我的 C 程序中,我将结构链表作为全局变量。然后我分叉了一个子进程。现在在子进程中如果我释放链表的一个节点,然后结束子进程。节点也会在父进程中消失吗?
当我尝试这个时,似乎节点仍然存在于父进程中......这是对的吗?为什么?
可能重复:
分叉后,全局变量是否共享?
在我的 C 程序中,我将结构链表作为全局变量。然后我分叉了一个子进程。现在在子进程中如果我释放链表的一个节点,然后结束子进程。节点也会在父进程中消失吗?
当我尝试这个时,似乎节点仍然存在于父进程中......这是对的吗?为什么?
fork(2)
创建父虚拟地址空间的副本struct
,因此除非您将这些s 放入共享内存中,否则它们是完全不相关的。
是的,它按预期工作,您不能从孩子(或来自父母的孩子)修改父母
这两个进程(父进程和子进程)是两个不同的进程,就像您的一个进程无法写入内存一样,例如,也在您的机器上运行的网络服务器,父进程无法写入子进程,反之亦然。
为了避免将父进程中的所有内容复制到子进程中,操作系统使用了一种称为“写时复制”的东西,其工作原理如下:当创建“子”进程时,代表父进程的页面被复制,并标记为“只读”。当发生写入时,操作系统会捕获该写入(这是不允许的,因为内存是只读的),并制作内存的副本,以便写入内存的进程作为它自己的内存副本 [并取消标记另一个进程上的“只读”,因此它现在可以修改数据,因为它具有原始内存内容]。
正如其他人所说,您可以通过使用“共享内存”(如果您愿意,也可以在完全独立的进程之间共享)来克服这个问题。