多個進程共享內存


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM