嗨我创建了一个服务器程序,它在接受套接字连接后分叉一个新的进程。 在程序中定义了几个静态分配的全局变量。我的问题是这些静态缓冲区后分配两次?还是叉只重复堆和调用堆栈上的地址空间?C静态变量和linux fork
8
A
回答
10
整个整个地址空间是重复的,包括所有全局变量和程序文本。
2
fork()
重复整个过程映像。所有的。因此,它们是否被分配两次......不,它们被分配一次,每个可执行映像现在有两个,而不是,如果您引用父级中的一个,它将不会保留与孩子,除非你使用共享内存。
在static
,该关键字是指本(来自ISO C99):
其标识符被声明 与外部或内部的键,或者 与存储类说明一个目的 静态具有静态存储持续时间。 它的使用寿命是程序的整个执行 并且它的存储值是 只有在 程序启动之前初始化一次。
这基本上意味着您的缓冲区将作为CRT启动例程的一部分初始化一次,并且该空间在您退出时仅会消失。在这种情况下,当每个孩子退出时,该存储消失。
6
整个地址空间在fork(2)
期间是“重复的”。它通常与写时复制完成,并且有关于共享程序文本和库的更多详细信息,但这与此处不相关。父进程和子进程都以自己的静态数据副本结束。
1
Linux使用名为copy-on-write的机制。这基本上意味着,只要变量不是修改父项,新进程就共享一个变量。但在变量被修改之前,它被复制并且新进程使用复制。这是出于性能原因而完成的,技术被称为延迟优化。所以你不应该担心在一个进程中改变变量会改变另一个进程。
相关问题
- 1. C#Webservice和静态变量
- 2. C/C++ linux fork()和exec()
- 3. C中的静态变量
- 4. C++静态变量
- 5. C++静态变量
- 6. C++ - 静态变量
- 7. C并发进程和静态变量
- 8. C#静态和常量变量内存
- 9. C++静态变量动态
- 10. C++,linux,fork,execvp,waitpid和SIGTSP
- 11. 静态与非静态变量C++
- 12. 静态类中的静态变量和非静态类中的静态变量
- 13. C++命名空间和静态变量
- 14. C++静态成员函数和变量
- 15. 静态变量和性能Objective-c
- 16. C++中的静态和全局变量
- 17. C++静态const变量和ROMable
- 18. C++中的静态变量
- 19. C++:静态成员变量
- 20. C++静态成员变量
- 21. 静态变量 - Visual C
- 22. C#线程静态变量
- 23. c#:(静态)班级变量
- 24. 静态函数和非静态变量
- 25. 静态变量和全局变量在Linux上的动态库和静态库中显示不同的地址?
- 26. C++:静态成员函数和变量 - 重新定义静态变量?
- 27. fork()和在Linux
- 28. C静态变量不更新
- 29. 静态变量和静态变量的区别是什么?
- 30. 静态全局变量和静态局部变量
我正在使用大约10MB的RAM,并且在拨号后没有看到可用内存下降的数量?如果静态分配在编译时发生,那么fork如何复制它? – 2011-02-02 20:10:39