在C程序中重新初始化库变量

时间:2012-07-19 18:45:29

标签: c linux service shared-libraries

我正在尝试编写一个程序,我必须通过(共享)库调用某些函数(其源代码可用)。库的C代码有几个全局变量,许多函数会更改这些全局变量的值。我在程序中要做的就是要求每个函数调用都使用一组新的变量。

例如,让此函数成为库的一部分:

int x = 1;

int foo()  
{  
    int a = 0;
    //do somethings to 'a'
    //...
    x++;
    return a;
}  

现在,每当我从程序中调用foo()时,x的值都会从1更新为2然后是3然后是4等等...我尝试构建一个程序,以便每次调用foo()时,它都会看到x = 1。

我很遗憾地说我对C / linux如何处理这些变量空间的了解不足,所以这个问题可能看起来很模糊。以上只是一个小例子;实际上,有很多变量几乎不可能手动重置它们的值。

编译该库和/或将其用于我的程序以刷新变量的最佳方法是什么?

(另一方面,我也想做的是并行调用foo(),但由于共享变量,我不能这样做。)

编辑: 在处理一些Web开发项目时,我曾经将一些代码封装在webservices中,然后从主程序中调用这些服务。 C / Linux中是否存在类似的框架?请注意,函数返回数据。

2 个答案:

答案 0 :(得分:3)

您已经发现全局变量(或一般的全局状态)是非常糟糕的主意的主要原因之一。

由于您可以访问源代码,我建议您花一些时间来重构源代码。

您可以使用以下策略实现对 foo 的调用并行化的功能:

  • 将所有全局变量收集到一个 struct 中。称之为 Context
  • 更改作用于全局变量的每个函数以获取指向上下文的指针,并更改函数以更新上下文中的变量,而不是更新全局变量
  • 现在,每个想要使用该库的线程都可以创建一个新的 Context 并将其传递给 foo 和相关函数。

如果对源代码进行此类更改是不可行的,则可以通过启动child processes来使用多个CPU核心。每个子进程都有自己的内存空间。该选项的效率不如使用多线程。

答案 1 :(得分:0)

我没有详细解答。但您可以尝试以下方法之一:

  1. 卸载并加载库
  2. 尝试清除库的.bss并使用库中的值填充.data节(ref dl_iterate_phdr()调用)。