动态库so/dll 数据共享

https://www.cnblogs.com/shijingjing07/p/5606930.html
http://pnxio.iteye.com/blog/2204451
https://bbs.pediy.com/thread-99734.htm

1.什么是DLL

DLL,即动态链接库,是包含若干个函数的库文件,可供其他程序运行时调用。

2.DLL的优缺点

优点:代码重用,可供多个程序同时调用
缺点:易发生版本冲突
当新版本的动态链接库不兼容旧版本时,其他使用该DLL的程序可能无法正常工作。
针对这一问题,我们需要在程序中加上一个manifest文件,指明该程序所使用的DLL版本号。

此时,程序将根据manifest加载指定版本的DLL,否则按默认版本加载。

3.DLL数据共享

1)在MinGW 中,用gcc编译,使用如下声明可以使变量a保存在共享section中,可以在多进程间共享数据,亲自测试过,可以行,倒是同样代码在linux gcc编译高级不是别,无法生效。 (百度了好久才查到#pragma comment(linker,"/SECTION:s_data,RWS")    这种VC中的设置在gcc中不生效,可以通过objdump -h 查看section是否生成


int __attribute__((section ("SHARED"), shared)) a= 0;

1.mydll.h

__declspec(dllexport) int add(int a, int b); 

2.mydll.c

#include "mydll.h" 
int __attribute__((section ("SHARED"), shared)) a1= 0;
//#pragma data_seg("s_data")     // 声明共享数据段,并命名该数据段  
 // volatile unsigned int guiCurrentPage = 255;
//#pragma data_seg()  
//#pragma comment(linker,"/SECTION:s_data,RWS")    

int add(int a, int b) //该DLL需要导出的函数功能:加法 
{ 
	 a1++;
     return a + b + a1; 
}
编译命令:gcc -shared -o MyDll.dll mydll.c 

3. t1.c

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
void main(void)
{
    typedef int(*padd)(int a,int b);
    HINSTANCE hDLL;
    padd add;
    hDLL=LoadLibrary("MyDll.dll");
    add=(padd)GetProcAddress(hDLL,"add");
    int result=add(5,8);
    printf("result %d\n",result);
	while(1)
	{
		;
	}
	FreeLibrary(hDLL);
} 
gcc -o t1.exe  t1.c -dll


2)VC中可以通过如下方式,使guiCurrentPage 成为共享数据(未实际测试过), 但是在MinGW的gcc中无效


#pragma data_seg("s_data")     // 声明共享数据段,并命名该数据段  
  unsigned int     guiCurrentPage = 255;  
#pragma data_seg()  
#pragma comment(linker,"/SECTION:s_data,RWS")    
3)Linux 共享库(动态库)与进程之间全局变量是无法共享的


如果想在进程间依靠动态库来共享全局变量恐怕是不太可能的事情,因为不同进程访问动态库时,是写时拷贝,即如果另外一个进程试图去修改动态库中的全局变量时,系统就会把这个全局变量拷贝一份单独给这个进程,而这个修改操作并不会影响到其他进程中变量的值。


4)但是可以用socket通讯进行进程间共享,比如universalsocket.so中有个socket_server.c和socket_client.c, 另一个进程通过调用动态的的方法 read_memory(int socket_pfd,u_int32 address,char*data) (前面先调用共享库中的方法,建立socket链接,通过socket句柄通讯)



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值