【问题标题】:Is it safe to call dlclose after dlsym在 dlsym 之后调用 dlclose 是否安全
【发布时间】:2014-09-30 22:19:46
【问题描述】:

来自 Windows,我习惯于在获得指向符号的指针后关闭 DLL 的句柄。使用 dl 函数时是否相同?在下面的示例中,调用 dlclose 后我仍然可以使用 myFunction 吗?如果没有,调用 dlclose 是否重要?

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

【问题讨论】:

  • 可以,只要你不打算打电话给myFunction...
  • 使用 dl 函数时也是这样吗? 是的,LoadLibrary()/FreeLibrary() 具有相同的语义,您很幸运没有遇到未映射的库后果。
  • 你说得很好,我认为我不受影响的唯一原因是因为我使用的库是常见的(即 kernel32 等)。
  • 是的,当然,如果应用程序已经在使用共享库/DLL,它仍然会保持打开状态——毕竟每个进程中只有一个共享库的实际副本[至少没有让操作系统多次加载它需要做很多工作]
  • 是的,在 osx 库中使用 dispatch_once 使得 dlclose 成为不可能。但我敢肯定没有人会关心,因为它是 ApplicationServices。

标签: c++ c linux macos


【解决方案1】:

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

当然,如果您使用handle = dlopen("someLibrary", 0); handle2 = dlopen("someLibrary", 0);,那么您可以dlclose(handle);,并且该库仍然“活跃”,因为还有另一个对其的引用 (handle2) 仍然活跃。

当然不能保证操作系统会立即取消映射,它可能会作为后台进程执行此操作,因此它可能会在关闭后立即调用它,但不能在 0.5 秒或类似时间内调用它。没有规范说它必须做一个或另一个,只是它不再有效使用

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

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

【讨论】:

    猜你喜欢
    • 2012-07-09
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    相关资源
    最近更新 更多