我有几个问题。 任何input赞赏。 谢谢。
这是我的理解:
是。
所有的内存被复制,所以你没有任何问题。
是。
两个进程保留所有打开的文件流的副本。 (默认情况下有一些fork选项可以改变我的想法。)在fork之后打开的流不被共享。
首先,请注意,这种行为是非常依赖于平台的。 如果除了闲散的好奇心之外,你还想问什么,我可以建议你重新考虑一下你的设计吗?
也就是说,fork和fork不保存的是POSIX标准 。 如何为C ++解释这取决于你的C ++(用户空间)运行时是如何实现的。
文件流是一个有趣的案例。 底层的文件描述符将被克隆,所以两个进程都会有一个开放的描述符。 但是用户空间缓冲区(如果有的话)很可能会被复制 。 所以,例如:
std::cout << "Hello!"; fork(); std::cout << std::endl;
…有很好的打印机会Hello!
两次,只是因为缓冲区将被复制(以及进程的地址空间中的其他所有内容)。
总之,我会回答你的问题:
这取决于班级和你的意思是“生存”。
它通过复制进程的整个虚拟地址空间来实现,除此之外。
指针保持它们的值,并且指向它们被重复。 (这是“懒惰地”完成的;也就是说“写入时复制”,所以它不像声音那样低效)
(re:文件流)见上面。
这可以很容易地通过键入man fork
来回答:
“孩子继承父母的打开的文件描述符的副本。”
“父项的整个虚拟地址空间在子项中复制”
基本上,子进程将与父进程完全相同(但请参阅手册页,了解这个过于简单的陈述的例外情况)。
它是如何实现的? 你想要什么水平的细节? 内存可能被实现为写入时拷贝(copy-on-write)。 但是这不是你的担心,子进程只是获得整个内存的一个精确副本。