C静态variables和linux fork

嗨,我创build了一个服务器程序,它在接受套接字连接之后分叉一个新的进程。 在程序中定义了几个静态分配的全局variables。 我的问题是这些静态缓冲区后分配两次? 还是叉只重复堆和调用堆栈上的地址空间?

Solutions Collecting From Web of "C静态variables和linux fork"

整个地址空间是重复的,包括所有的全局变量和程序文本。

fork(2)期间整个地址空间是“重复的”。 这通常是通过copy-on-write来完成的,关于共享程序文本和库的细节还有更多,但在这里并不重要。 父进程和子进程都以自己的静态数据副本结束。

fork()复制整个过程映像。 所有的。 因此,他们分配两次…不,他们被分配一次每个可执行映像,现在有两个,不,如果你指的是在父母,它不会有相同的内容孩子,除非你使用共享内存。

static ,这个关键字意味着这(来自ISO C99):

使用外部或内部链接或静态存储类说明符声明标识符的对象具有静态存储持续时间。 它的生命周期是程序的整个执行过程,在程序启动之前,它的存储值只被初始化一次。

这基本上意味着您的缓冲区将作为CRT启动例程的一部分被初始化,并且只有当您退出时,该空间才会消失。 在这种情况下,每个孩子退出时,该存储就会消失。

Linux使用名为copy-on-write的机制。 这基本上意味着,只要变量不是修改父进程,新进程共享一个变量。 但在变量被修改之前,它被复制,并且新进程使用复制。 这是由于性能的原因,技术被称为懒惰优化。 所以你不应该担心在一个进程中改变变量会改变另一个进程。