1. 程式人生 > >跨程序:多個程序共享記憶體

跨程序:多個程序共享記憶體

這樣也可節約很多空間啊,找到了這片部落格寫的很好,怎麼能錯過記錄。感謝原作者。

  • 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");
    }