跨进程:多个进程共享内存

这样也可节约很多空间啊,找到了这片博客写的很好,怎么能错过记录。感谢原作者。

原文地址:杯小年;多个进程共享内存

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

猜你喜欢

转载自blog.csdn.net/Scarlett_OHara/article/details/82657599