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