2011-11-05 87 views
2

我有一个在c库中定义的全局变量[例如:int globalcount = 0] 和库初始化函数[说library_init] globalcount增加1。动态变量具有静态存储行为与使用dlopen加载库时的动态变量

这里的问题是:当库使用dlopen和申请电话library_init功能打开和使用dlclose然后再dlopen的呼叫正在重置的globalcount 0

闭库,我想知道如何防止全局复位变量[我想globalcount必须是1而不是0] 当下一个dlopen被调用,因为进程不是退出所以全局变量也不能退出等。

如果库链接到在链接时使用-l进行处理,我不面临abv问题。 只有当库打开使用dlopen /问题dlclose [多次]

在Linux操作系统上 PROG兰:C 编译器:GCC

怎么办,在数据段的内存不能释放时dlclose叫?

+0

这是一个操作系统问题,而不是语言问题。如果你告诉我们操作系统,它可能会有帮助(尽管我怀疑它)。当调用dlclose()时,如何将变量的状态保存到文件中。 –

+0

操作系统是Linux,我们不想将任何想法保存到一个文件中,我认为它不是一个好方法。是否有任何方式使用静态存储类可以解决abv问题 – Syedsma

+0

我认为你应该问问自己你为什么要在该库上执行'dlclose'的问题。我想不出多大用处。 –

回答

1

当你调用dlclose时,你的dll被卸载,这意味着你的库的数据段中的任何内存都被释放。这就是将值重置为0的原因。即使您的库已卸载,您也可以使用shared memory来创建一个持久变量。

+0

是否有任何最简单的方法,使我可以在整个流程生命中使用verialbe? – Syedsma

+0

@syedsma正如我所说的:当.so卸载所有被它占用的内存时,它就被释放了。没有其他办法了。它是如何设计共享对象的。 –

+0

如何在dlclose调用时不要释放数据段中的内存? – Syedsma

0

使用dlopen加载库时使用RTLD_NODELETE标志。当我们使用这个标志时,全局静态变量和全局静态变量会在内存中持续存在。即使库的引用计数变为零。