dlopen后不调用dlclose会有什么问题

肥多罗 2009-11-18 05:35:15
如题.
服务器里面使用的,一直开着不关机 那么这样不close与dlclose会有什么区别吗?
或者是其他什么 大家讨论一下.
...全文
1125 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨星 2009-11-18
  • 打赏
  • 举报
回复
不过还是要当心一些,欠的债总是要还的。
比如万一哪天你的代码模块将被别人复用,而且并非复用到另一个服务程序中,而是另外一个更一般的程序中……
所以,故意留下这种漏洞又有什么意思呢。。。
肥多罗 2009-11-18
  • 打赏
  • 举报
回复
恩 机器要是只有开机 就一直运行 知道需要时关机 这就没close的问题了
do_fork 2009-11-18
  • 打赏
  • 举报
回复
早期的windows,内存管理很差劲,即使你程序没问题,一直不关机也会越来越慢,
于是XX公司派专员定期给windows NT主机按RESET重启。

进程结束了,这个进程持有的资源,都会被os释放。
晨星 2009-11-18
  • 打赏
  • 举报
回复
服务程序里而且是一直使用的东西确实可以算做一种特殊情况。
但只讨论“特殊情况”又有啥意思呢。
理论上,类似这样的“可以不close”的“特殊情况”还不止一种呢。再比如只打印一个“hello world”就退出的程序。
xixiaoliu 2009-11-18
  • 打赏
  • 举报
回复
资源泄露呀!
文中是linux下 C++动态库 实现接口提供类导出的一个例子 注意其中使用函数返回基类指针的用法,因为Linux的动态链接库不能像MFC中那样直接导出类 一、介绍 如何使用dlopen API动态地加载C++函数和类,是Unix C++程序员经常碰到的问题。 事实上,情况偶尔有些复杂,需要一些解释。这正是写这篇mini HOWTO的缘由。 理解这篇文档的前提是对C/C++语言中dlopen API有基本的了解。 这篇HOWTO的维护链接是: http://www.isotton.com/howtos/C++-dlopen-mini-HOWTO/ 二、问题所在 有时你想在运行时加载一个库(并使用其中的函数),这在你为你的程序写一些插件或模块架构的时候经常发生。 在C语言中,加载一个库轻而易举(调用dlopen、dlsym和dlclose就够了),但对C++来说,情况稍微复杂。 动态加载一个C++库的困难一部分是因为C++的name mangling (译者注:也有人把它翻译为“名字毁坏”,我觉得还是不翻译好), 另一部分是因为dlopen API是用C语言实现的,因而没有提供一个合适的方式来装载类。 在解释如何装载C++库之前,最好再详细了解一下name mangling。 我推荐您了解一下它,即使您对它不感兴趣。因为这有助于您理解问题是如何产生的,如何才能解决它们。 1. Name Mangling 在每个C++程序(或库、目标文件)中, 所有非静态(non-static)函数在二进制文件中都是以“符号(symbol)”形式出现的。 这些符号都是唯一的字符串,从而把各个函数在程序、库、目标文件中区分开来。 在C中,符号名正是函数名:strcpy函数的符号名就是“strcpy”,等等。 这可能是因为两个非静态函数的名字一定各不相同的缘故。 而C++允许重载(不同的函数有相同的名字但不同的参数), 并且有很多C所没有的特性──比如类、成员函数、异常说明──几乎不可能直接用函数名作符号名。 为了解决这个问题,C++采用了所谓的name mangling。它把函数名和一些信息(如参数数量和大小)杂糅在一起, 改造成奇形怪状,只有编译器才懂的符号名。 例如,被mangle后的foo可能看起来像foo@4%6^,或者,符号名里头甚至不包括“foo”。 其中一个问题是,C++标准(目前是[ISO14882])并没有定义名字必须如何被mangle, 所以每个编译器都按自己的方式来进行name mangling。 有些编译器甚至在不同版本间更换mangling算法(尤其是g++ 2.x和3.x)。 即使您搞清楚了您的编译器到底怎么进行mangling的,从而可以用dlsym调用函数了, 但可能仅仅限于您手头的这个编译器而已,而无法在下一版编译器下工作。 三、类 使用dlopen API的另一个问题是,它只支持加载函数。 但在C++中,您可能要用到库中的一个类,而这需要创建该类的一个实例,这不容易做到。 四、解决方案 1. extern "C" C++有个特定的关键字用来声明采用C binding的函数: extern "C" 。 用 extern "C"声明的函数将使用函数名作符号名,就像C函数一样。 因此,只有非成员函数才能被声明为extern "C",并且不能被重载。 尽管限制多多,extern "C"函数还是非常有用,因为它们可以象C函数一样被dlopen动态加载。 冠以extern "C"限定符后,并不意味着函数中无法使用C++代码了, 相反,它仍然是一个完全的C++函数,可以使用任何C++特性和各种类型的参数。
byOpen是一个绕过移动端系统限制的增强版dlfunctions库。 byOpen特性: 支持App中加载和使用Android系统库接口(即使maps中还没有被加载也支持)。 Android 7以上dlopen, System.load都是被限制调用的,虽然目前网上有Nougat_dlfunctions等库通过从maps中找so库来绕过加载限制。 不过对于app中还没被加载到maps的so库,这种方式就不行了。 而byOpen不仅支持fake dlopen方式从maps加载,还可以将还没加载到maps的so库绕过系统限制强行加载进来使用,实现更加通用化得dlopen。 注:目前的实现方式理论上还是比较通用的,至少我这Android 10上测试ok,但还没完整详细测试过,是否使用请自行评估。 byOpen相关原理: 具体实现原理还是比较简单的,主要还是借鉴了一种绕过Android P对非SDK接口限制的简单方法的思想和实现方式。 虽然这篇文章中主要目的是为了绕过hide api,不过它里面使用的将自己假装成系统调用的方式,一样可以用到System.loadLibrary上去,让系统以为是系统自身在调用System.loadLibrary 从而绕过Android N的classloader-namespace限制,将系统/system/lib中任意so库加载到maps中,然后再通过fake dlopen的方式去dlsym。 byOpen接口用法: 相关静态库和接口在:dlopen.h 相关使用方式跟原生dlopen完全相同: typedef by_char_t const* (*curl_version_t)(); by_pointer_t handle = by_dlopen("libcurl.so", BY_RTLD_LAZY); if (handle) {     by_pointer_t addr = by_dlsym(handle, "curl_version");     if (addr)     {         curl_version_t curl_version = (curl_version_t)addr;         by_print("curl_version: %s", curl_version());     }     by_dlclose(handle); }
byOpen是一个绕过移动端系统限制的增强版dlfunctions库。byOpen特性支持App中加载和使用Android系统库接口(即使maps中还没有被加载也支持)。 Android 7以上dlopen, System.load都是被限制调用的,虽然目前网上有Nougat_dlfunctions等库通过从maps中找so库来绕过加载限制。 不过对于app中还没被加载到maps的so库,这种方式就不行了。 而byOpen不仅支持fake dlopen方式从maps加载,还可以将还没加载到maps的so库绕过系统限制强行加载进来使用,实现更加通用化得dlopen。 注:目前的实现方式理论上还是比较通用的,至少我这Android 10上测试ok,但还没完整详细测试过,是否使用请自行评估。byOpen相关原理具体实现原理还是比较简单的,主要还是借鉴了一种绕过Android P对非SDK接口限制的简单方法的思想和实现方式。 虽然这篇文章中主要目的是为了绕过hide api,不过它里面使用的将自己假装成系统调用的方式,一样可以用到System.loadLibrary上去,让系统以为是系统自身在调用System.loadLibrary 从而绕过Android N的classloader-namespace限制,将系统/system/lib中任意so库加载到maps中,然后再通过fake dlopen的方式去dlsym。byOpen接口用法相关静态库和接口在:dlopen.h 相关使用方式跟原生dlopen完全相同: typedef by_char_t const* (*curl_version_t)(); by_pointer_t handle = by_dlopen("libcurl.so", BY_RTLD_LAZY); if (handle) { by_pointer_t addr = by_dlsym(handle, "curl_version"); if (addr) { curl_version_t curl_version = (curl_version_t)addr; by_print("curl_version: %s", curl_version()); } by_dlclose(handle); }

64,680

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧