分叉子进程和C++对象

pic*_*c11 2 c++ linux

我有几个问题.任何输入都表示赞赏.谢谢.

  • C++类是否能够生存下去?
  • 如果是这样,它是如何实现的?
  • 指针会发生什么?复制整个免费存储/堆并保留所有虚拟地址?
  • 文件流会发生什么?

Mic*_*son 7

这是我的理解:

  • C++类是否能够生存下去?

是.

  • 如果是这样,它是如何实现的?

所有内存都被复制,所以你没有遇到麻烦.

  • 指针会发生什么?复制整个免费存储/堆并保留所有虚拟地址?

是.

  • 文件流会发生什么?

这两个进程都保留了所有打开文件流的副本.(默认情况下,有一些fork选项可以改变这一点我认为.)fork之后打开的流不是共享的.


Nem*_*emo 6

首先,请注意此行为与平台有很大关系.如果你要求除了好奇心之外的其他任何事情,我建议你重新考虑一下你的设计吗?

也就是说,fork所保留和未保存的内容由POSIX标准指定.如何解释这个C++取决于你的C++(用户空间)运行时是如何实现的.

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

std::cout << "Hello!";
fork();
std::cout << std::endl;
Run Code Online (Sandbox Code Playgroud)

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

简而言之,我会回答你的问题:

  • 这取决于班级以及"生存"的意思.

  • 它通过复制进程的整个虚拟地址空间等来实现.

  • 指针保持其价值,并指出它们的重复.(这是"懒洋洋地"完成的;即"写入时复制",因此它不像它听起来那么低效)

  • (re:文件流)见上文.