Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >C共享库:静态变量初始化+进程间的全局变量可见性

我想修改一个现有的共享库,以便它根据使用共享库的应用程序使用不同的内存管理例程。

(目前)将有两个系列的内存管理例程:

  • 标准malloc、calloc等功能
  • malloc、calloc等的专门版本

我想出了一个解决这个问题的潜在方法(在这里的一些人的帮助下)。到目前为止,仍有一些灰色地带,我想就我的建议提出一些意见。

这就是我打算如何执行修改:

  1. 将对malloc/calloc等的现有调用替换为my_malloc/my_calloc等。这些新函数将调用正确分配的函数指针,而不是调用硬编码函数名。
  2. 为共享库提供一种机制,用于初始化my_malloc等使用的函数指针,以指向标准的C内存mgmt例程--这允许我向依赖于共享库的应用程序提供向后兼容性--因此它们也不必进行修改。在C++中,我可以通过使用静态变量初始化(例如)来做到这一点--我不确定在C中是否可以使用相同的“模式”。
  3. 引入一个新的幂等函数initAPI(type)函数,它由需要在共享libray中使用不同mgmt例程的应用程序调用(在启动时)。initAPI()函数将内存mgmt分配给适当的函数。

显然,如果我可以限制谁可以调用initAPI()或者何时调用它(例如,函数不应该在API调用到库之后调用),这将改变内存mgmt例程,这将是更好的选择。因此,我想限制它的名称和由谁。这是一个访问问题,可以通过C++中的私有方法来解决,我不知道如何在C中这样做。

上面第2和第3段的问题可以在C++中解决,但是我不得不使用C语言,所以我想用C来解决这些问题。

最后,假设函数指针可以在上面描述的初始化过程中正确地设置--我还有第二个问题,关于共享库中全局变量的可见性,它使用共享库跨越不同的进程。函数指针将作为全局变量来实现(目前我并不太关心线程安全性--尽管我设想在某个时候使用互斥锁来包装访问)*并且每个使用共享库的应用程序都不应该干扰用于另一个使用共享库的应用程序的内存管理例程。

我怀疑使用shlib在进程之间共享的是代码(而不是数据)--不过,我希望得到确认--最好是有一个支持该断言的链接。

*注:如果我天真地低估了我上面描述的“架构”在未来可能发生的线程问题,请有人提醒我!

顺便说一句,我正在Linux上构建库(Ubuntu)。

EN

回答 5

Stack Overflow用户

发布于 2012-01-06 09:48:50

由于我不完全确定问题是什么,我将尝试提供可能有用的信息。

您已经指出了Clinux,假设您也在使用GNU可能是安全的。

GCC提供了一个构造函数功能属性,该构造函数会在执行进入main()之前自动调用。您可以使用它来更好地控制库初始化例程initAPI()被调用时的情况。

代码语言:javascript
代码运行次数:0
复制
void __attribute__ ((constructor)) initAPI(void);

对于库初始化,如果库在运行时加载,则在dlopen()返回之前执行构造函数例程;如果在加载时加载库,则在启动main()之前执行构造函数例程。

GNU有一个--wrap <symbol>选项,允许您为系统功能提供包装器。

如果您链接到--wrap malloc,对malloc()的引用将重定向到__wrap_malloc() (您实现的),而对__real_malloc()的引用将重定向到原始的malloc() (因此您可以在包装器实现中调用它)。

与使用--wrap malloc选项提供对原始malloc()的引用不同,您还可以使用dlsym()动态加载指向原始malloc()的指针。不能从包装器直接调用原始malloc(),因为它将被解释为对包装器本身的递归调用。

代码语言:javascript
代码运行次数:0
复制
#define _GNU_SOURCE
#include <stdio.h>
#include <stdint.h>
#include <dlfcn.h>

void * malloc(size_t size) {
   static void * (*func)(size_t) = NULL;
   void * ret;

   if (!func) {
      /* get reference to original (libc provided) malloc */
      func = (void *(*)(size_t)) dlsym(RTLD_NEXT, "malloc");
   }

   /* code to execute before calling malloc */
   ...

   /* call original malloc */
   ret = func(size);

   /* code to execute after calling malloc */
   ...

   return ret;
}

我建议阅读杰伊康罗德博客文章,标题为http://www.jayconrod.com/cgi/view_post.py?23,以获得关于用调用自己的包装函数替换动态库中函数调用的其他信息。

票数 3
EN

Stack Overflow用户

发布于 2012-01-06 03:52:51

-1由于缺乏具体问题。这篇文章很长,可以写得更简洁,而且不包含一个问号。

现在,为了解决您的问题:

共享库的静态数据(您称之为“全局变量”)是每个进程。一个进程中的全局变量不会干扰另一个进程中的全局变量。不需要互斥。

在C语言中,不能使用restrict1调用函数。它可以被任何知道它的名字或者有指针的人调用。您可以编写initAPI()代码,这样如果它不是第一个调用的库函数,它就会明显地中止程序(崩溃)。你是图书馆的作者,你设定了游戏规则,你对那些不尊重规则的程序员没有义务。

1您可以用静态方式声明函数,这意味着它只能由同一翻译单元中的代码调用;任何设法获得指向它的指针的人仍然可以通过指针调用它。这些函数不是从库中“导出”的,所以这不适用于您的场景。

票数 1
EN

Stack Overflow用户

发布于 2012-01-06 06:28:06

为此目的:

(目前)将有两个系列的内存管理例程:

  • 标准malloc、calloc等功能
  • malloc、calloc等的专门版本

在Linux上使用动态库非常简单,并且不需要复杂的方案(也不需要@ugoren建议的LD_PRELOADdlopen )。

当您想提供malloc和朋友的专门版本时,只需将这些例程链接到您的主要可执行文件。瞧:您现有的共享库将从那里获取它们,不需要任何修改。

您还可以将专门的malloc构建到例如libmymalloc.so中,并将该库放在libc之前的链接线上,以获得相同的结果。

动态加载器将使用它可以看到的第一个malloc,并从a.out开始搜索列表,然后按照链接命令行中列出的相同顺序搜索其他库。

更新:

进一步考虑一下,我认为你的建议行不通。

是的,它可以工作(我每天都使用这个功能,将tcmalloc链接到我的主要可执行文件中)。

当您的共享库(提供API的库)调用malloc“幕后”时,它得到了(可能有几个) malloc实现?第一个是动态链接器可见的。如果您将一个malloc实现链接到a.out中,那么这就是其中的一个。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8756540

复制
相关文章
「Geek-r」数据导入
在掌握一定的 R 编程技能后,我们开始迈入数据分析的殿堂。大部分数据分析事务的数据都不是通过 R 创建,而是来自于各种数据收集软硬件、渠道,包括 Excel、网络等。本章聚焦于如何将数据导入 R 中以便于开始数据分析。对于本章的内容,读者既可以系统地从头到尾深入阅读学习,也可以根据自己实际工作需要或时间限制选择一些重点或感兴趣内容进行掌握。
王诗翔呀
2020/07/03
1.3K0
「Geek-r」数据导入
R中的数据导入与导出
1、数据的导入 导入文本文件 使用read.table函数导入普通文本文件 read.table(file,header=FALSE,sep="",...) #导入csv文件 data1 <- rea
Erin
2018/01/09
2.3K0
R中的数据导入与导出
mysql导入excel文件_将Excel数据导入MySQL「建议收藏」
去年的投资统计月报数据量庞大,原始表格是xls格式(还是EXECL2003的),单个sheet最大只能放几万行,但数据总量有10万行以上,于是只能存成两个sheet。EXECL2010格式倒是单个sheet可以放得下,可是居然不能将数据完整的从一个sheet复制粘贴到另一个sheet(可能是因为行数太多)。正好想学习一下execl数据导入MySQL数据库的方法,于是开始尝试。
全栈程序员站长
2022/10/02
16.1K0
mysql导入excel文件_将Excel数据导入MySQL「建议收藏」
R数据科学整洁之道:使用 readr 进行数据导入
有同学问要怎么把自己的数据读入 R,由于 tidyverse 工具套件的简单高效,是我们数据处理的优先选择。因此这里介绍tidyverse里的两个包:readr、 readxl,一个读取文本文件,一个读取 Excel 文件,这两种文件是平时用得最多的。
简说基因
2022/11/11
7590
R基础——数据的导入与导出(下)
前面两篇文章介绍了导入导出csv文件,txt文件,xlsx文件,接下来,将介绍R连接数据库,从数据库中导入数据。 在我工作中,使用的是sql server,所以将以sql server为主来介绍。R中没有提供sql server的独立DBI,GitHub有一个RSQLserver包,曾在cran中上线过,后来下线了。我主要使用RODBC包连接数据库。 RODBC包 在使用RODBC包连接sql server数据库之前,需要先设置ODBC数据源管理器来配置sql server驱动。 以win7系统为例,配置s
企鹅号小编
2018/01/25
1.5K0
R excel 工作
The package tidyverse includes several useful packages using in data analysis,
大发明家
2021/12/06
1920
文件操作
一般情况下我们需要分析的数据都是存储在文件中,那么利用 R 分析数据的第一步就是将输入读入 R 语言。如果分析的数据是记录在纸质载体上,还需要将数据手动录入,然后保存为一个文件。在 R 中分析文件一般是文件文件,通常是以逗号分隔的 csv 文件,如果数据本身包含逗号,就需要使用制表符 tab 分隔的文件。有些情况下还有需要处理其他统计软件生成的文件,例如 Excel 生成的 xlsx 格式文件等。R 可以很方便地读写多种格式文件。
生信喵实验柴
2022/10/25
2.7K0
文件操作
R语言highfrequency高频金融数据导入
因此对于原始数据,我们可以整理成sample数据的格式,然后使用xts包先将其转换成xts格式。
拓端
2020/07/22
1.1K0
R语言highfrequency高频金融数据导入
使用 VBA 将 Excel 数据导入到 Word 表格中
现要求将一个 Excel 数据表中的每行数据导成一个 Word 文档,即有多少行数据就生成多少个 Word 文档,Excel 每列与 Word 文档中的表格项一一对应。
mzlogin
2020/04/16
4.8K0
使用 VBA 将 Excel 数据导入到 Word 表格中
现要求将一个 Excel 数据表中的每行数据导成一个 Word 文档,即有多少行数据就生成多少个 Word 文档,Excel 每列与 Word 文档中的表格项一一对应。
零式的天空
2022/03/24
4.7K0
R语言入门之数据的导入和导出
在我们平时的研究工作中,经常使用的是逗号分隔文件(.csv文件)、制表符分隔文件(.tsv文件)和空格分隔文件(.txt文件)。当然对于一些基因组文件或者其它格式的文件,各自有各自的特点,原则上R语言可以读取任何格式的文件,只需掌握基本的读取文件方法后按照不同特点调整参数即可。
生信与临床
2020/08/06
3.4K0
使用R语言转存Excel到MySQL
花了两天时间写了一个Excel数据转换脚本,原需求除了要把数据转存到Mysql中,还要对每一条数据进行拆分和重组,并不容易。最终我利用R语言完成了这个小需求,本着总结学习的想法,在此处将多余逻辑删除,抽离出了最基本的Excel转存Mysql的功能,这样也可以算一个小轮子了。(仅做学习用,Navicat等工具可以直接导入Excel)
ZONGLYN
2020/06/29
8250
使用R语言转存Excel到MySQL
R语言之数据获取操作
实际上,R 中有大量的内置数据集可用于分析和实践,我们也可以在R 中创建模拟特定分布的数据。而在实际工作中,数据分析者更多时候面对的是来自多种数据源的外部数据,即各式各样扩展名的数据文件,如 .txt、.csv、.xlsx、.xls 等。不同扩展名的文件代表不同的文件格式,这常常会给分析者带来困扰。
timerring
2023/10/13
4230
如何将多份数据保存在一个excel中?
最傻的方法:一个个导出呗,导到不同的excel表格中。但是问题来了,我要模拟10组参数,每个参数有5个表格,这样做的话会产生50个表格!这多让人头大。
庄闪闪
2021/04/09
1.6K0
添加插件,便于将Excel格式的数据导入Gephi。
4、点击[Convert Excel and csv files to networks]
裴来凡
2022/05/28
1.8K0
添加插件,便于将Excel格式的数据导入Gephi。
.NET 使用OLEDB导入Excel数据
/** * *在本章节中主要讲解的是如何使用OLEDB将Excel中的数据导入到数据库中 * */ using System; using System.Data; using System.Data.OleDb; using System.Data.SqlClient; using System.IO; using System.Text; using System.Web; using System.Web.UI; private DataTable xsldata()
追逐时光者
2022/02/15
8860
Python将数据库数据导入到EXCEL
      每次给运营导数据的时候,如果不用工具的话,就是直接生成.csv格式的文件,这样的文件不支持'sheet',每次还有手工进行,相当的不科学,今天试试Python生成excel文件。
py3study
2020/01/08
2.7K0
使用vb将excel导入PowerDesigner,生成表结构
3、 打开PowerDesigner,创建物理模型(Physical Data Model)
用户5640963
2019/07/25
1.7K0
使用vb将excel导入PowerDesigner,生成表结构
规模数据导入高效方式︱将数据快速读入R—readr和readxl包
Hadley Wickham 和 RStudio团队写了一些新的R包,这些包对于每个需要在R中读入数据的人来说都是非常有用的。readr包提供了一些在R中读入文本数据的函数。readxl包提供了一些在R中读入Excel电子表格数据的函数。它们的读取速度远远超过你目前正在用的一些函数。
悟乙己
2019/05/26
1.1K0
点击加载更多

相似问题

R Openxlsx包(版本4.2.2) -文件中的错误(description= xlsxFile):无效的'description‘参数

10

Osmar package in R "Error in file(con,"r"):无法打开连接“

15

将Excel数据导入R

25

将excel数据导入R

10

R openxlsx Excel导出: XML错误

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文