精华内容
下载资源
问答
  • 动态库中,关于全局变量的调用

    千次阅读 2014-09-26 11:01:01
    测试目的:动态库全局变量使用方法 cheshi

    测试目的:动态库中全局变量的使用方法


    测试经过:动态库a中有一个全局变量,动态库b链接动态库a,主程序c链接a、b,在程序c中改变全局变量的值,查看pri在动态库b中的值是否改变了


    测试结果:主程序和库b共用一套a的动态库,共用一套全局变量。


    库a的代码:

    #include<stdio.h>
    
    int pri =0;
    
    void fun()
    {
    	printf("i am is a ,pri = %d\n",pri);
    }
    void change()
    {
    	pri = 6;
    }

    编译:gcc -shared sa.c -o libsa.so


    库b的代码:

    #include<stdio.h>
    #include<sa.h>
    
    void fun_b()
    {
    	printf("i am is b\n");
    	fun();
    }
    
    编译:gcc -shared sb.c -o libsb.so

    主程序C的代码:

    #include<stdio.h>
    
    #include "sa.h"
    #include "sb.h"
    
    int main()
    {
    	fun();
    	printf("===========================\n");
    	fun_b();
    	printf("===========================\n");
    	change();
    	printf("===========================\n");
    	fun_b();
    	printf("===========================\n");
    	fun();
    }
    

    编译:gcc -I../sa -I../sb -o test main.c -lsa -lsb 

    注意:动态库使用的时候ldd test会发现自己编译的库无法找到,所以可以把动态库移动到/lib或/usr/lib目录下


    输出结果:

    i am is a ,pri = 0
    ===========================
    i am is b
    i am is a ,pri = 0
    ===========================
    ===========================
    i am is b
    i am is a ,pri = 6
    ===========================
    i am is a ,pri = 6

    展开全文
  • 请问动态链接库被外部多次调用时,每次调用中动态库自身的全局变量都会重新初始化吗?如果会那怎么来使我每次调用动态库时都从上次的状态开始执行呢? 你这个问题得分被调用的是同一个进程还是不同的进程。如果是...

    动态链接库的全局变量问题

    请问动态链接库被外部多次调用时,每次调用中动态库自身的全局变量都会重新初始化吗?如果会那怎么来使我每次调用动态库时都能从上次的状态开始执行呢?

    你这个问题得分被调用的是同一个进程还是不同的进程。如果是不同的进程,那么你的动态连接库就完全是重新加载的。因为动态连接库是被映射到调用的那个进程的空间里的,而不同的进程有不同的地址空间,所以不同进程调用同一个DLL基本就没什么关系,除非你声明了一些变量在共享数据段,这样这些变量就会在不同的进程间共享。

    如果你同一个进程多次LoadLibrary,就不一定会重新初始化,事实上Windows是这样运作的。他为动态连接库创建一个变量用来记录被Load的次数,在一个进程中每次LoadLibrary这个引用计数就会加1,每次FreeLibrary这个引用记录就会减1,当计数变为0时,Windows则完全释放这个DLL,这时候你再一次加载,那么所有初始化的工作就会重新来一遍。如果你加载已经在程序其他地方加载过的DLL,那么就不会初始化。

    保存状态可以保存到文件,保存到注册表等。

    展开全文
  • 之前在linux下做过一个测试: 写一个so,该so中有一个全局变量。so中的代码在运行时会修改该全局...此时,很显然so只被加载了一份,那么,当这么多程序在运行调用该so时,该so中的全局变量的值会被覆盖来覆盖去么...

    原文:https://blog.csdn.net/lionzl/article/details/64172805

     

    之前在linux下做过一个测试:

    写一个so,该so中有一个全局变量。so中的代码在运行时会修改该全局变量的值。然后,有多个程序都需要该so,而且这些应用程序都启动了。此时,很显然so只被加载了一份,那么,当这么多程序在运行调用该so时,该so中的全局变量的值会被覆盖来覆盖去么?

    答案是不会。这是测试的答案。

    现在知道原理了,尽管这是windows via C/C++中解释的windows的做法,但是我想linux也是这么类似处理的。

    windows 使用memory map来加载exe和dll。当一个exe/dll有多个instance要启动时,实际在windows paging file(包括RAM和swap文件)中,exe和牵涉到的dll,只有一份。这样可以节省内存使用,也可以提高性能。

    也就是说,如果是exe,虽然每个instance都有自己独立的地址空间,但是地址空间映射到storage的时候,他们映射的都是同样的地方。这样就带来问题了:exe/dll中的全局变量和静态变量怎么办?每个instance都有可能会修改这些变量。

    windows 的做法是,该存放全局变量和静态变量的page,设定copy on write protect attribute。所以,当任何一个线程尝试修改这些page中的内容时,windows负责分配一个新的page出来,然后修改该线程的地址空间,将 这个新分配的page的地址设置上去,从此以后,该线程修改这个全局变量或是静态变量,操作的就是这个新分配的page了。这样,多个实例就不会出现全局 变量或静态变量互相覆盖的问题了。

    展开全文
  • 【每个进程调用的动态库中的全局变量都是一个拷贝,各自进程需要自己去初始化各自的全局,而且操作全局也互补影响】 ...概念就不多说了,下面主要讨论一下在进程中使用共享库(动态库)声明的全局变量
    【每个进程调用的动态库中的全局变量都是一个拷贝,各自进程需要自己去初始化各自的全局,而且操作全局也互补影响】
    【比如banker.c,在sghall里面有个初始化,在游戏进程里也有初始化,需要两者共享变量得用共享内存或者其他进程间通讯】
    Linux共享库(动态库)与进程之间共享全局变量可行性分析
     
    概念就不多说了,下面主要讨论一下在进程中使用共享库(动态库)声明的全局变量的问题:
     
    网上有一篇介绍在主程序中使用动态链接库里的全局变量的文章,可能会给人一些误导。首先,在主程序中可以使用动态链接库中的全局变量是正确的,不可否认的,但这需要在程序编译链接时就要把动态库加上,并在需要使用的程序中使用extern声明变量,这其实没有达到动态库的本质目的(使用时再调用);这其实不算是一个大问题,如果只在一个进程中使用也不会有问题,这里主要讨论在多进程中使用动态库全局变量的问题。
     
    如果想在进程间依靠动态库来共享全局变量恐怕是不太可能的事情,因为不同进程访问动态库时,是写时拷贝,即如果另外一个进程试图去修改动态库中的全局变量时,系统就会把这个全局变量拷贝一份单独给这个进程,而这个修改操作并不会影响到其他进程中变量的值。
     
     
    测试结果:
    主进程首先修改了这个值,然后在子进程中读取到的是主进程修改后的值,但是子进程中的修改并没有影响到主进程中的使用的动态库中的全局变量。所以试图使用动态库在进程间共享全局变量的方法是行不通的
     
    附:编译方法
    gcc -fPIC-shared testshare.c -o libtestshare.so.2.0
    gcc -o main -L/main main.c libtestshare.so.2.0
    ./main
    展开全文
  • 最近看代码,发现一个在动态库中在全局变量A,我在动态库外部extern引用的时候总是提示undefined错误。首先确认在引用同一个动态库中的API函数B没有问题。首先看来下动态库中,readelf命令导出文件的信息,发现:1....
  • 多进程引用的动态链接中的全局变量问题现有liba.so中定义一个全局变量char buf; libb.so 中的函数print会将buf进行输出。 进程A和进程B使用-lb进行编译链接,并在进程A和B中分别对buf进行初始化,如strcpy(buf,...
  • 动态链接全局变量与多线程

    千次阅读 2018-09-30 16:48:16
    最近对多线程调用时,动态链接全局变量有了以下几点认识。 1、动态链接被同一进程的多个线程加载时,全局变量的值是进程有效。  例如:动态链接C.dll有一个全局变量 int g_iCount=0(初始值)。某一函数...
  • C++又一坑:动态链接中的全局变量

    千次阅读 2017-03-20 22:12:27
     前几天我们项目的日志系统出现了一点问题,但是一直没有时间去深究。 昨天在同事的帮助下,无意中猜了一种可能性,结果还真被我...关键在于静态a里有一个静态全局变量,没错就是我们的日志模块。 原先的这个
  • 此时,很显然so只被加载了一份,那么,当这么多程序在运行调用该so时,该so中的全局变量的值会被覆盖来覆盖去么? 答案是不会。这是测试的答案。 现在知道原理了,尽管这是windows via C/C++中解
  • 如果一个共享对象libtest.so中定义了一个全局变量G,而进程A和进程B都使用了libtest.so, 那么当进程A改变这个全局变量G的值时,进程B中的G会受到影响吗? 古人云:实践出真知... /* * =========================...
  • 同事找我看一个问题,一个访问全局变量不符合预期的问题。 因为新工程中静态库动态库非常多,非常不利于分析问题。 再因为并不是一个业务逻辑问题,而是一个语言层面的问题,所以我单独抽象出产生问题的环境,简化...
  • 全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量全局变量本身就是静态存储方式...而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静
  • 用vs编译动态库如果配置错误会导致全局变量初始化。 例子: string a="hello"; char b="hello"; int main(int arg,char* argv[]) { printf("string a=%s",a.c_str()); printf("char* b=%s",b); } ...
  • 进程间是相互独立的,其实完全可以看成A、B两个进程各自有一份单独的liba.so和libb.so,相应的动态库的代码段和数据段都是各个进程各自有一份的。 然后在这个基础上,由于代码段是不会被修改的,所以操作系统可以...
  • 动态库内容分析 文章目录动态库内容分析1. 动态库编译1.1 第一个C文件:basic.c1.2第二个C文件:demo.c1.3第三个C文件:main.c2.动态库编译3.二进制内容分析3.1 libbasic.so分析3.1.1 basic.c内容汇总3.1.2 libbasic...
  • 要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环...
  • 要用全局变量,需要使用"::"  局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环...
  • 而其中要用到一个全局的变量才能把需要的句柄给传出来,于是就想,如果有多个进程要调用这个动态库时,后面的进程调用同一个动态库时,是否会把以前调用同一个动态库时的全局变量的值改变?????我猜
  • C++中局部变量可否与全局变量重名

    千次阅读 2019-01-19 14:11:31
    此问题研究的是变量的作用域的问题。一个声明将一个名字引进一个作用域;局部变量(通常在函数中定义)的作用域是...与全局变量重名的局部变量可以屏蔽全局变量,如果想在块内使用全局变量需要通过作用域解析运算符...
  • 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 61,073
精华内容 24,429
关键字:

动态库能使用外部全局变量吗