来自Windows我用来在获取指向符号的指针后关闭DLL的句柄。使用dl函数时这是一样的吗?在下面的例子中,调用dlclose后我仍然可以使用myFunction吗?如果没有,调用dlclose甚至不重要吗?
void* handle = dlopen ("someLibrary", 0);
if (handle)
{
myFunction = dlsym (handle, "MyFunction");
dlclose (handle);
}
答案 0 :(得分:13)
dlclose
关闭共享库(假设它是对它的唯一引用),这意味着操作系统将取消映射共享库,MyFunction
很可能不再在内存中。
当然,如果您执行handle = dlopen("someLibrary", 0); handle2 = dlopen("someLibrary", 0);
,那么您可以dlclose(handle);
并且图书馆仍然是#34;活着"因为还有另一个参考文献(handle2
)仍然存在。
当然不能保证操作系统立即取消映射,它可能会将其作为后台进程,因此它可以在关闭后立即调用它,但不能在0.5秒内完成,或者某些操作。没有规范说它必须做一个或另一个,只是它不再有效使用
如果您只打开一个库,请在整个程序中使用它,然后在退出之前调用dlclose
可能不是必需的,但如果您打开了很多库(例如,在某个库中使用某种插件)长时间运行的程序可以/将使用许多不同的插件,如果你不打电话dlclose
,程序可能会耗尽虚拟地址空间。
(无论如何,所有共享库都会在退出时关闭,因此在退出时将其打开应该不是问题)