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

Posted

技术标签:

【中文标题】在 C 程序中重新初始化库变量【英文标题】:Re-initialize library variables in C program 【发布时间】:2012-07-19 18:45:29 【问题描述】:

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

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

int x = 1;

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

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

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

编译该库和/或在我的程序中使用它以刷新变量的最佳方法是什么?

(顺便说一句,我还想做的是并行化对 foo() 的调用,但由于共享变量,我不能这样做。)

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

【问题讨论】:

您的附注表明您所要求的并不能解决您的实际问题。 谢谢!有什么建议么?我们可以创建类似服务的东西并从我的程序中调用它吗? 【参考方案1】:

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

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

您可以通过以下策略实现对 foo 的并行调用:

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

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

【讨论】:

谢谢。库源代码中有数十万行代码。我什至无法想象试图改变每个变量的用法。 我能想到的并行处理的唯一其他方法是启动多个子进程。当然不如线程有效,但可能是一个解决方案。更新我的答案以包括这种可能性。 这绝对有帮助。还有一件事:每个子进程计算一个值,我试图在 wait() 之后对父进程中的所有这些值求和。但由于显而易见的原因,我无法检索这些值(或在子进程执行时将它们存储在父内存中)。你能推荐点什么吗? 您需要某种形式的进程间通信。这可能就像子进程在完成后使用其进程 ID 编写文件一样简单(记住在新运行之前清除旧文件),或者您可以使用此处列出的方法之一:***.com/questions/2849147/…【参考方案2】:

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

    卸载和加载库 尝试清除库的 .bss 并使用库中的值填充 .data 部分(参考 dl_iterate_phdr() 调用)。

【讨论】:

以上是关于在 C 程序中重新初始化库变量的主要内容,如果未能解决你的问题,请参考以下文章

指针变量初始化为NULL啥意思?

程序员自我修养阅读笔记——运行库

程序员自我修养阅读笔记——运行库

C语言 静态变量的初始化

VS2010 编写c语言变量为啥要初始化?

Linux下C/C++动态库在运行时是怎样加载进来的