- 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\n", p[i]); } UnmapViewOfFile(lpbase);//解除 CloseHandle(hmapfile); system("pause"); }