考虑一个 Foo
拥有一些资源
struct Foo
{
~Foo();
};
和全局std::vector<Foo>
.也许是愚蠢的例子,但它很好地说明了问题。
std::vector<Foo> bar;
现在,进程 fork
如果bar
然后仅由子进程修改,然后调用 exit
应该是在子进程中做的正确事情。如果调用 _exit
, 任何 Foo
:s 在酒吧会泄漏。如果 parent 向 bar
添加了一些东西在 fork 之前,这些对象可能会被销毁两次。或者这可能不是问题,因为它们应该被视为不同的对象。
将对象生命周期与 fork
一起处理的正确方法是什么? .让 child 处理这个问题是唯一理智的方法exec
重新开始?
我应该注意到,在程序的这一点上,保证只有一个线程。
最佳答案
What is the proper way of dealing with object lifetime together with a
fork
?
fork 时处理共享资源的正确方法取决于这些对象或资源是什么。
对于进程内存中的任何对象或变量,你automatically get a copy它在 fork 时。然后每个进程将能够修改或销毁任何变量而不影响其他进程。这也意味着每个进程负责清理其唯一的资源拷贝。
对于存在于进程之外的其他资源,如文件、网络套接字或共享内存;处理它们的最佳方法将取决于该资源是什么。通常,这些最佳实践将由您最初用于创建这些资源的库/API 概述。
关于c++ - fork 后全局资源的归属,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58417618/