• Linux共享库(动态库)与进程之间全局变量是无法共享的


    【每个进程调用的动态库中的全局变量都是一个拷贝,各自进程需要自己去初始化各自的全局,而且操作全局也互补影响】
    【比如banker.c,在sghall里面有个初始化,在游戏进程里也有初始化,需要两者共享变量得用共享内存或者其他进程间通讯】
    Linux共享库(动态库)与进程之间共享全局变量可行性分析
     
    概念就不多说了,下面主要讨论一下在进程中使用共享库(动态库)声明的全局变量的问题:
     
    网上有一篇介绍在主程序中使用动态链接库里的全局变量的文章,可能会给人一些误导。首先,在主程序中可以使用动态链接库中的全局变量是正确的,不可否认的,但这需要在程序编译链接时就要把动态库加上,并在需要使用的程序中使用extern声明变量,这其实没有达到动态库的本质目的(使用时再调用);这其实不算是一个大问题,如果只在一个进程中使用也不会有问题,这里主要讨论在多进程中使用动态库全局变量的问题。
     
    如果想在进程间依靠动态库来共享全局变量恐怕是不太可能的事情,因为不同进程访问动态库时,是写时拷贝,即如果另外一个进程试图去修改动态库中的全局变量时,系统就会把这个全局变量拷贝一份单独给这个进程,而这个修改操作并不会影响到其他进程中变量的值。
     
     
    测试结果:
    Linux共享库(动态库)与进程之间共享全局变量可行性分析 - IT心雪 - NET START HERE
     
    可以看到,主进程首先修改了这个值,然后在子进程中读取到的是主进程修改后的值,但是子进程中的修改并没有影响到主进程中的使用的动态库中的全局变量。所以试图使用动态库在进程间共享全局变量的方法是行不通的
     
    附:编译方法
    gcc -fPIC-shared testshare.c -o libtestshare.so.2.0
    gcc -o main -L/main main.c libtestshare.so.2.0
    ./main
  • 相关阅读:
    大话重构连载首页
    大话重构连载19:大对象的演化过程
    大话重构连载18:最常见的问题
    大话重构连载17:抽取方法的实践
    大话重构连载16:超级大函数
    大话重构连载15:采用Mock技术完成测试
    大话重构连载14:我们是这样自动化测试的
    大话重构连载13:自动化测试——想说爱你不容易
    大话重构连载12:你不能没有保险索
    大话重构连载11:小步快跑是这样玩的
  • 原文地址:https://www.cnblogs.com/vanishfan/p/2854584.html
Copyright © 2020-2023  润新知