分叉subprocess和C ++对象

我有几个问题。 任何input赞赏。 谢谢。

  • C ++类生存分叉吗?
  • 如果是的话,它是如何实施的?
  • 指针会发生什么? 整个免费商店/堆是复制和所有虚拟地址被保留?
  • 文件stream会发生什么?

这是我的理解:

  • C ++类生存分叉吗?

是。

  • 如果是的话,它是如何实施的?

所有的内存被复制,所以你没有任何问题。

  • 指针会发生什么? 整个免费商店/堆是复制和所有虚拟地址被保留?

是。

  • 文件流会发生什么?

两个进程保留所有打开的文件流的副本。 (默认情况下有一些fork选项可以改变我的想法。)在fork之后打开的流不被共享。

首先,请注意,这种行为是非常依赖于平台的。 如果除了闲散的好奇心之外,你还想问什么,我可以建议你重新考虑一下你的设计吗?

也就是说,fork和fork不保存的是POSIX标准 。 如何为C ++解释这取决于你的C ++(用户空间)运行时是如何实现的。

文件流是一个有趣的案例。 底层的文件描述符将被克隆,所以两个进程都会有一个开放的描述符。 但是用户空间缓冲区(如果有的话)很可能会被复制 。 所以,例如:

std::cout << "Hello!"; fork(); std::cout << std::endl; 

…有很好的打印机会Hello! 两次,只是因为缓冲区将被复制(以及进程的地址空间中的其他所有内容)。

总之,我会回答你的问题:

  • 这取决于班级和你的意思是“生存”。

  • 它通过复制进程的整个虚拟地址空间来实现,除此之外。

  • 指针保持它们的值,并且指向它们被重复。 (这是“懒惰地”完成的;也就是说“写入时复制”,所以它不像声音那样低效)

  • (re:文件流)见上面。

这可以很容易地通过键入man fork来回答:

  • “孩子继承父母的打开的文件描述符的副本。”

  • “父项的整个虚拟地址空间在子项中复制”

基本上,子进程将与父进程完全相同(但请参阅手册页,了解这个过于简单的陈述的例外情况)。

它是如何实现的? 你想要什么水平的细节? 内存可能被实现为写入时拷贝(copy-on-write)。 但是这不是你的担心,子进程只是获得整个内存的一个精确副本。