dlopen后使用fork

时间:2018-04-24 14:23:33

标签: c++ linux

我使用dlopen在我的程序中加载动态链接库(.so),名为dlsym,以获取某个函数foo的地址。

然后我在子流程中使用fork并调用foo,并使用exit(0)退出子流程。到现在为止,一切都还好。

当我尝试fork并在子流程中再次调用foo时,我发现foo中定义的静态变量存储的所有数据都已丢失。我确信我没有明确地调用像dlclose这样的函数。那么如何防止数据消失?

非常感谢。

2 个答案:

答案 0 :(得分:1)

你想要共享内存。有关一些介绍性的指示,请参阅error。然而,要预先警告,同步是棘手的​​,您可能最终会想要更高级别的抽象,如消息传递或信号量。

(或者,也许forking不是你正在寻找的模型。线程实际上是使用相同的进程内存空间拥有多个执行路径的概念......)

答案 1 :(得分:1)

fork您的程序会重复其地址空间,包括foo静态本地的存储空间。它是通过调用foo在子进程中初始化的副本。

毫不奇怪,原始存储空间不变,正如您可以从第二个fork看到的那样,并在该未初始化存储的第二个副本上调用foo