如何通过一个应用程序加载共享库,并通过Linux中的另一个应用程序卸载

时间:2014-04-08 17:27:43

标签: shared-libraries

我正在使用linux系统并拥有一个共享库。

我想在第一个应用程序想要使用库时加载并运行共享库。 并且想要在最后一个应用程序关闭时unolad并停止库。

假设第一个应用程序加载库,现在第二个和第三个应用程序也开始使用该库。但是现在应用程序正在关闭,因此应用程序应该不应该卸载它应该运行的库,直到最后一个应用程序没有关闭。

我怎么能实现这种情况? 我想搜索但没有得到答案?

提前致谢。

1 个答案:

答案 0 :(得分:1)

  

我正在尝试搜索但没有得到答案

这很可能是因为你的问题是(似乎是)基于很多假设(关于它是什么意思和#34;正在运行"和#34;被加载")在MS-DOS时代已经成为现实,但在任何最近的操作系统上几乎肯定都不是。

当第一个应用程序加载共享库(让我们称之为libfoo.so)时,libfoo.so的代码和数据将映射到进程的内存中正在运行第一个应用程序。代码通常以只读方式映射,并且数据具有读写权限。

当第二个应用程序(进程)启动并且还使用libfoo.so时,将执行相同的映射,并且第一个映射中使用的相同物理内存现在出现在第二个进程的虚拟地址空间(但可能位于不同的地址)。在进程之间共享物理内存是为什么库被称为 shared 的原因。

数据稍微复杂一些,它与写时复制(COW)语义共享。

当使用libfoo.so的最后一个进程退出时,libfoo.so代码和数据占用的物理页面最终可以被释放,并且库被卸载。

所以,对你的应用程序的一个答案就是不应该卸载它应该继续运行的库,直到最后一个应用程序没有关闭"问题是这会自动发生。

另一个答案是"它应该继续运行的图书馆"没有意义,因为只有进程可以运行;图书馆不能。