繁体   English   中英

C静态变量和linux fork

[英]C static variables and linux fork

嗨,我创建了一个服务器程序,该程序在接受套接字连接后派生一个新进程。 程序中定义了几个静态分配的全局变量。 我的问题是在派生后是否两次分配了这些静态缓冲区? 还是fork只复制堆和调用堆栈上的地址空间?

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

fork(2)期间,整个地址空间被“复制”。 它通常是通过复制完成的,并且有更多有关共享程序文本和库的详细信息,但这与此处无关。 父进程和子进程最终都拥有自己的静态数据副本。

fork()复制整个过程映像。 所有的。 因此,它们分配了两次...不,每个可执行映像现在分配了两次,不,如果您在父级中引用一个,则不会包含与父映像相同的内容。除非您使用共享内存。

static ,该关键字表示此含义(来自ISO C99):

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

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

Linux使用称为写时复制的机制。 这基本上意味着,只要不修改变量,父级和新进程就会共享一个变量。 但是在修改变量之前,先将其复制,然后新过程将使用复制。 出于性能原因完成此操作,该技术称为延迟优化。 因此,您不必担心在一个过程中更改变量会在另一个过程中更改它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM