在dlsym之后调用dlclose是否安全?

来自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 ,程序可能会用尽虚拟地址空间。

(所有的共享库在退出时都是关闭的,所以在退出时打开它不应该成为问题)