多个进程共享内存

Posted 芬乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多个进程共享内存相关的知识,希望对你有一定的参考价值。

  • HANDLE hmapfile = OpenFileMapppingA(FILE_MAP_READ, FALSE, "shijiaxing");    //打开共享内存,可以用于进程通信,也可以用于线程通行。第一个参数是首地址第二个参数表示是否将其锁定为当前的进程内,FALSE表示不锁定。第三个是命名。
  • 在操作系统中,一个进程是不能读写另一个进程的内存的,他们的进程内存必须是互相独立的,C语言把所有的设备都当作文件来处理,在内存里开辟了一段数据,开辟了一段缓冲区,把他模拟成设备,两个进程就能同时访问。如果多个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"); }

 

以上是关于多个进程共享内存的主要内容,如果未能解决你的问题,请参考以下文章

df 报告磁盘使用情况,但在共享内存 /dev/shm 中没有文件

[Python3] 043 多线程 简介

DLL 如何处理来自多个进程的并发?

进程间通信

从一个进程创建多个共享内存

如何使用共享内存而不是通过多个进程之间的酸洗来传递对象