在dlsym之后调用dlclose是否安全

时间:2014-09-30 22:19:46

标签: c++ c linux macos

来自Windows我用来在获取指向符号的指针后关闭DLL的句柄。使用dl函数时这是一样的吗?在下面的例子中,调用dlclose后我仍然可以使用myFunction吗?如果没有,调用dlclose甚至不重要吗?

void* handle = dlopen ("someLibrary", 0);
if (handle)
{
    myFunction = dlsym (handle, "MyFunction");
    dlclose (handle);
}

1 个答案:

答案 0 :(得分:13)

dlclose关闭共享库(假设它是对它的唯一引用),这意味着操作系统将取消映射共享库,MyFunction很可能不再在内存中。

当然,如果您执行handle = dlopen("someLibrary", 0); handle2 = dlopen("someLibrary", 0);,那么您可以dlclose(handle);并且图书馆仍然是#34;活着"因为还有另一个参考文献(handle2)仍然存在。

当然不能保证操作系统立即取消映射,它可能会将其作为后台进程,因此它可以在关闭后立即调用它,但不能在0.5秒内完成,或者某些操作。没有规范说它必须做一个或另一个,只是它不再有效使用

如果您只打开一个库,请在整个程序中使用它,然后在退出之前调用dlclose可能不是必需的,但如果您打开了很多库(例如,在某个库中使用某种插件)长时间运行的程序可以/将使用许多不同的插件,如果你不打电话dlclose,程序可能会耗尽虚拟地址空间。

(无论如何,所有共享库都会在退出时关闭,因此在退出时将其打开应该不是问题)