我有几个问题。任何输入都表示赞赏。谢谢。
答案 0 :(得分:7)
以下是我的理解:
是
所有内存都被复制,所以你没有遇到任何麻烦。
是
两个进程都保留所有打开文件流的副本。 (默认情况下,我认为有一些fork选项可以改变它。) fork之后打开的流不会被共享。
答案 1 :(得分:6)
首先,请注意此行为非常依赖于平台。如果你要求除了好奇心之外的其他任何事情,我建议你重新考虑一下你的设计吗?
也就是说,fork保留的内容由the POSIX standard指定。如何解释这个C ++取决于你的C ++(用户空间)运行时是如何实现的。
文件流是一个有趣的案例。底层文件描述符将被克隆,因此两个进程都将具有一个打开的描述符。但是用户空间缓冲区(如果有的话)很可能会重复。所以,例如:
std::cout << "Hello!";
fork();
std::cout << std::endl;
...很有可能两次打印Hello!
,因为缓冲区将被复制(以及进程地址空间中的所有其他内容)。
简而言之,我会回答你的问题:
这取决于班级以及“生存”的含义。
它是通过复制流程的整个虚拟地址空间来实现的。
指针保留其值,并指出它们重复的内容。 (这是“懒惰地”完成的;即“写入时复制”,因此它的效率并不像它可能听起来那么低效。
(re:文件流)见上文。
答案 2 :(得分:3)
键入man fork
:
“孩子继承父母的一组打开文件描述符的副本。”
“父级的整个虚拟地址空间在子级中复制”
基本上,子进程将与父进程处于完全相同的状态(但是请参阅手册页以获取这个极其过于简单的语句的一长串异常列表)。
如何实施?你想要什么程度的细节?内存可以实现为写时复制。但这不是你关心的问题,子进程只是获得整个内存的精确副本。