跨程序:多個程序共享記憶體
阿新 • • 發佈:2018-12-09
這樣也可節約很多空間啊,找到了這片部落格寫的很好,怎麼能錯過記錄。感謝原作者。
- 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"); }