文章来源:http://blog.csdn.net/huanglong8/article/details/53770815
在Windows内核编程中,有提到过共享数据段的内容,如果朋友以为我是要说FileMap文件映射的话,那可就错了,因为我觉得既然要先说共享内存,就要先说最简单,使用最方便的一种方法。
在windows下编程,vs有提供给我们很多编译和链接指令,我同大家一样,知道但不熟知,这里大名鼎鼎的就是#pragma了,它是预处理器的一组语法,根绝不同的语法结构和参数可以帮助我们完成各项工作。最简单的共享内存,如下例:
#pragma data_seg("MyShare")
unsigned int flag = 0;
char mydata[32] = {0};
#pragma data_seg()
#pragma comment(linker, "/Section:MyShare,RWS")
语法说明:MyShare是你可以自定义的一种数据段名称,这个名称用来标识在data_seg关键字中间的内容存储的内存块名称。像flag和mydata这两个变量则会放到堆上,
它仅仅只是告诉编译器,以下的这些变量放在另外一个地方,那么要实现共享,还还需要告诉链接器,这片数据段是什么作用.
Section:MyShare,RWS指的是一种访问类型,RWS分别代表可读,可写,共享。在做一些API工具开发的时候,我们需要进行详细设置,以免哪个程序员破坏了数据导致程序异常。
data_seg以外的变量,是不被共享的,如果需要在data_seg意外进行设置共享数据,则需要用到以下语法
__declspec(allocate("MyShare")) char mydata[32] = {0};
allocate的作用主要是在参数MyShare内存段上,主动分配内存。这种做法也是为了可以跳开data_seg片的限制,在需要的代码段中进行设置。
此部分仅仅简单介绍了共享数据段的基础使用,有空时,可以再深入的了解下。
数据段共享注意:
- #pragma data_seg之间的变量必须是初始化的,否则将无法共享。
- #pragma comment(linker 必不可少,它才是设置共享的开关。
- 如果这片内存没有被加载到进程中时,则会被释放。
由于这种机制简单且方便,所以大部分程序员会将这部分共享放入到dll中,方便管理,方便维护,下一章我直接会用案例来实现AB进程聊天的需求。