多个进程共享内存

  • 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");
}
时间: 2024-08-07 03:31:21

多个进程共享内存的相关文章

父子进程共享内存通信的三种方法

1.  mmap MAP_ANONYMOUS 在支持MAP_ANONYMOUS的系统上,直接用匿名共享内存即可, 2. mmap  /dev/zero 有些系统不支持匿名内存映射,则可以使用fopen打开/dev/zero文件,然后对该文件进行映射,可以同样达到匿名内存映射的效果. 3. shmget shmat shmctl shmget 是老式的system V 共享内存模式,很多系统都支持这种方法. 父子进程共享内存通信的三种方法

IPC: 共享内存

################################################### 共享内存区   共享内存是IPC形式中最快的,因为共享内存不和内核进行数据交换. 通过fork派生的子进程不与父进程共享内存区.   共享内存区分为: 1.posix共享内存区 2.system V共享内存区 共享内存有两种形式: 1.匿名共享内存 2.有名共享内存 ----------------------------------------------------------- posi

细说linux IPC(五):system V共享内存

system V共享内存和posix共享内存类似,system V共享内存是调用shmget函数和shamat函数.           shmget函数创建共享内存区,或者访问一个存在的内存区,类似系统调用共享内存的open和posix共享内存shm_open函数.shmget函数原型为: #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg); key: 函

阐述linux IPC(五岁以下儿童):system V共享内存

[版权声明:尊重原创.转载请保留源:blog.csdn.net/shallnet 要么 .../gentleliu,文章学习交流,不用于商业用途] system V共享内存和posix共享内存类似,system V共享内存是调用shmget函数和shamat函数. shmget函数创建共享内存区,或者訪问一个存在的内存区,类似系统调用共享内存的open和posix共享内存shm_open函数. shmget函数原型为: #include <sys/ipc.h> #include <sys

Unix IPC之基于共享内存的计数器

目的 本文主要实现一个基于共享内存的计数器,通过父子进程对其访问. 本文程序需基于<<Unix网络编程-卷2>>的环境才能运行.程序中大写开头的函数为其小写同名函数的包裹函数,增加了错误处理信息. 1 函数介绍 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include <sys/mman> /**  * Map addresses starting near ADDR an

Linux环境编程之共享内存区(一):共享内存区简单介绍

共享内存区是可用IPC形式中最快的.一旦内存区映射到共享它的进程的地址空间,进程间数据的传递就不再涉及内核.然而往该共享内存区存放信息或从中取走信息的进程间通常须要某种形式的同步.不再涉及内核是指:进程不再通过运行不论什么进入内核的系统调用来彼此传递数据.内核必须建立同意各个进程共享该内存区的内存映射关系.然后一直管理内存区. 默认情况下通过fork派生的子进程并不与其父进程共享内存区. mmap函数把一个文件或一个Posix共享内存区对象映射到调用进程的地址空间.使用该函数的目的有: 1.使用

IPC之共享内存

在多进程程序中(vfork创建的多进程除外),即使是全局变量也无法共享,各个进程都会保存局部变量或全局变量的副本,供自己使用. 共享内存将文件地址映射到内存中即可让多个进程共享内存中的数据. 内存映射API #include<sys/mman.h> void *mmp(void *addr, size_t len, int prot, int flags, int fd, off_t offset);//调用成功则返回被映射区的起始地址,出错则为MAP_FAILED addr可以指定描述符fd

(转载)linux下的僵尸进程处理SIGCHLD信号Linux环境进程间通信(五): 共享内存(下)

Linux环境进程间通信(五): 共享内存(下) 在共享内存(上)中,主要围绕着系统调用mmap()进行讨论的,本部分将讨论系统V共享内存,并通过实验结果对比来阐述两者的异同.系统V共享内存指的是把所有共享数据放在共享内存区域(IPC shared memory region),任何想要访问该数据的进程都必须在本进程的地址空间新增一块内存区域,用来映射存放共享数据的物理内存页面. 系统调用mmap()通过映射一个普通文件实现共享内存.系统V则是通过映射特殊文件系统shm中的文件实现进程间的共享内

撸代码--linux进程通信(基于共享内存)

1.实现亲缘关系进程的通信,父写子读 思路分析:1)首先我们须要创建一个共享内存. 2)父子进程的创建要用到fork函数.fork函数创建后,两个进程分别独立的执行. 3)父进程完毕写的内容.同一时候要保证子进程退出后,在删除共享内存. 4)子进程完毕读的内容. 效果展示:                 代码展示:           #include <string.h> #include <unistd.h> #include <sys/types.h> #inc