- HANDLE hmapfile = OpenFileMapppingA(FILE_MAP_READ, FALSE, "shijiaxing"); //打开共享内存,可以用于进程通信,也可以用于线程通行。第一个参数是首地址第二个参数表示是否将其锁定为当前的进程内,FALSE表示不锁定。第三个是命名。
- 在操作系统中,一个进程是不能读写另一个进程的内存的,他们的进程内存必须是互相独立的,C语言把所有的设备都当作文件来处理,在内存里开辟了一段数据,开辟了一段缓冲区,把他模拟成设备,两个进程就能同时访问。如果多个cgi需要通信,就需要访问这个设备,
- 在内存里开辟了一段缓冲区,然后将这个缓冲区模拟成一个设备,那么另外两个进程就可以同时访问它。一个写一个读。如果多个cgi需要通行就需要访问这个”设备“,共享内存主要用在, 同时有很多个进程要同时访问。
CreateFileMappingA(INVALID_HANDLE_VALE, NULL, PAGE_READWRITE|SEC_COMMIT, 0, SIZE, "mingzi")
CreateFileMappingA相当于创建了一个文件映射,同时会分配一段内存给我们。开辟完成之后就相当于创建了一个设备。
CreateFileMapping不仅仅是操作文件,还可以操作设备,我们可以在内存理开辟一段内存,模拟一个设备。
管理多个进程,用的最多的就是cgi。
1.服务端
#include<stdio.h> #include<stdlib.h> #include<Windows.h> #define SIZE 4096 LPVOID lpdata = NULL;//指针标识首地址 void main() { if (lpdata!=NULL) { puts("共享内存存在"); } HANDLE hmap = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, SIZE, "yinchengmem"); if (hmap==NULL) { puts("创建失败"); } else { //映射文件到指针 lpdata = MapViewOfFile(hmap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); //映射文件,创建指针,指向这片内存。 ///char str[100] = "hello world ,hello china"; /// memcpy(lpdata, str, strlen(str) + 1);//拷贝内存 int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; memcpy(lpdata, a, 40); } system("pause"); UnmapViewOfFile(lpdata);//解除,释放该函数的输入参数为调用MapViewOfFile()时所返回的指向文件映像在进程的地址空间中
//的起始地址的指针在调用MapViewOfFile()后,必须确保在进程退出之前能够执行UnmapViewOfFile()函数,否则在进程终止之后先前保
//留的区域将得不到释放,即使再次启动进程重复调用 MapViewOfFile()系统也总是在进程的地址空间中保留一个新的区域,而此前保留的所
//有区域将得不到释放。 CloseHandle(hmap); system("pause"); }
2.客户端
#include<stdio.h> #include<stdlib.h> #include<Windows.h> void main() { HANDLE hmapfile = OpenFileMappingA(FILE_MAP_READ, FALSE, "yinchengmem"); if (hmapfile == NULL) { printf("开辟失败"); } //创建指针,指向这片内存 LPVOID lpbase = MapViewOfFile(hmapfile, FILE_MAP_READ, 0, 0, 0); //将刚刚创建的内存映射到定义指针hmapfile
if (lpbase == NULL) { printf("open失败"); } //printf("%s", (char*)lpbase); int*p = lpbase; for (int i = 0; i < 10;i++) { printf("%d ", p[i]); } UnmapViewOfFile(lpbase);//解除 CloseHandle(hmapfile); system("pause"); }