共享内存入门

如果想要在两个进程之间进行传输数据,共享内存是其中一个方法。当然个人觉得,共享内存主要的还是用来节约内存。

首先使用下面的函数创建一个新的文件映射内核对象

HANDLE CreateFileMapping(
  HANDLE hFile,                               //物理文件句柄
  LPSECURITY_ATTRIBUTES lpAttributes,  //安全设置
  DWORD flProtect,                            //保护设置
  DWORD dwMaximumSizeHigh,              //高位文件大小
  DWORD dwMaximumSizeLow,                //低位文件大小
  LPCTSTR lpName                                  //共享内存名称
);

然后用

LPVOID   MapViewOfFile(

HANDLE   hFileMappingObject,  
  DWORD   dwDesiredAccess,  
  DWORD   dwFileOffsetHigh,  
  DWORD   dwFileOffsetLow,  
  DWORD   dwNumberOfBytesToMap

);

将一个文件映射对象映射到当前应用程序的地址空间

之后就可以对MapViewOfFile()返回的值进行操作了。

值得注意的是:CreateFileMapping()创建的映射对象本来就存在的话,那么该函数相当于执行了OpenFileMapping()

函数的功能。

创建并写数据:

 1         LPVOID lpShareMem = NULL;
 2         // appの名前をチェック
 3         if (lstrcmpi(szExeName, "SsView") == 0)
 4         {
 5             g_hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, "PDFLibShare");
 6             if (g_hMapFile == NULL)
 7             {
 8                 g_hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, MAX_PATH, "PDFLibShare");
 9             }
10             if(g_hMapFile != NULL)
11             {
12                 // 共有メモリに書き込み
13                 lpShareMem = MapViewOfFile(g_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
14                 if (lpShareMem != NULL)
15                 {
16                     //if (g_szDocAddress == NULL || g_szDocAddress[0] == ‘\0‘)
17                     {
18                         char szShareMem[MAX_PATH] = {0};
19                         memcpy(g_szDocAddress, (char*)m_pdCurrentDoc, strlen((char*)m_pdCurrentDoc));
20                         memcpy(szShareMem, m_szCurrentFilePath, strlen(m_szCurrentFilePath));
21                         vector<char*> *wrk_vectorShareMem = (vector<char*>*)lpShareMem;
22                         wrk_vectorShareMem->push_back(szShareMem);
23                     }
24                 }
25             }
26         }
27         // メモリ解放
28         if (lpShareMem != NULL)
29         {
30             UnmapViewOfFile(lpShareMem);
31             lpShareMem = NULL;
32         }

打开并check数据:

 1         if (lstrcmpi(szExeName, "PfuSsOrg") == 0)
 2         {
 3             hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, "PDFLibShare");
 4             if(hMapFile != NULL)
 5             {
 6                 // 共有メモリのチェック
 7                 lpShareMem = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
 8                 char *szShareMem = (char*)lpShareMem;
 9                 if (lstrcmpi(szShareMem, m_szCurrentFilePath) == 0)
10                 {
11                     if (lpShareMem != NULL)
12                     {
13                         UnmapViewOfFile(lpShareMem);
14                         lpShareMem = NULL;
15                     }
16                     if (hMapFile != NULL)
17                     {
18                         CloseHandle(hMapFile);
19                         hMapFile = NULL;
20                     }
21                     return 13; // SsViewで開ける
22                 }
23             }
24         }

时间: 2024-10-03 01:31:37

共享内存入门的相关文章

进程间通信IPC:消息队列,信号量,共享内存

2015.3.4星期三 阴天 进程间通信:IPC 文件对象:记录文件描述符,文件开关等 IPC标示符:系统全局的流水号两个进程要通信,打开的是唯一的对象进行通讯,通过key操作 XSI IPC:消息队列,信号量,共享内存. ipcs 查看ip对象共享内存,信号量,消息队列等信息ipcrm 删除一个IP对象 Linux为用户提供了完善的,强大的网络功能完善的内置网络:其他操作系统不包含如此紧密的和内核结合在一起的网络部分 共享内存标示符的获取有两种方法:ftok(pathname,id)另一个是K

IPC(SystemV) 之 共享内存

很久以来我都是只闻其名,未见其形.终于在这次系统的学习linux编程中接触到了共享内存.果然很牛. 上一篇文章中我们讲的信号量,个人感觉,严格的说,信号量只是进城通信的辅助.而共享内存才真正实现了进程通信. 共享内存机制允许两个不想关的进程访问同一段物理内存,当然得是一台主机. 头文件<sys/shm.h>   和信号量的情况一样,也需要包含sys/types.h 和 sys/ipc.h .当然有可能已经包含在了sys/shm.h中了. 共享内存函数如下: int shmget(key_t k

Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存

Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> 参考:C和指针学习 说明:本文非常的长,也是为了便于查找和比较,所以放在一起了 Linux 传统的进程间通信有很多,如各类管道.消息队列.内存共享.信号量等等.但它们都无法介于内核态与用户态使用,原因如表 通信方法 无法介于内核态与用户态的原因 管道(不包括命名管道) 局限于父子进程间的通信. 消息队列 在

php 共享内存

转:php 共享内存 共享内存主要用于进程间通信 php中的共享内存有两套扩展可以实现 1.shmop  编译时需要开启 --enable-shmop 参数 实例: $shm_key = ftok(__FILE__, 't'); /** 开辟一块共享内存 int $key , string $flags , int $mode , int $size $flags: a:访问只读内存段 c:创建一个新内存段,或者如果该内存段已存在,尝试打开它进行读写 w:可读写的内存段 n:创建一个新内存段,如

Linux --进程间通信--共享内存

一.共享内存 共享内存是最高效的通信方式,因为不需要一个进程先拷贝到内核,另一个进程在存内核中读取. 二. ipcs -m 查看共享内存 ipcrm -m 删除共享内存 三.主要函数 shmget 创建 shmctl 删除 shmat 挂接 shmdt 取消挂接 ********* man 函数名 查看***** 四.代码实现 comm.h   1 #pragma once   2 #include<stdio.h>   3 #include<stdlib.h>   4 #incl

linux共享内存之mmap

这应该可以算得上是IPC的一种,虽然效率可能并没有其它IPC方式高. 看到map很容易联想到映射.的确,mmap就是一种映射方式,将打开的文件和一段连续的内存做映射.使得对内存进行操作即可以实现对文件的读写,反过来,也就是说,可以通过这种方式来达到进程通信. mmap系列涉及三个函数. void * mmap(void *buf, size_t len, int prot, int flag, int fd, off_t offset); 此函数建立一个共享内存,prot即为权限,可选值有PRO

linux 共享内存实现

说起共享内存,一般来说会让人想起下面一些方法:1.多线程.线程之间的内存都是共享的.更确切的说,属于同一进程的线程使用的是同一个地址空间,而不是在不同地址空间之间进行内存共享:2.父子进程间的内存共享.父进程以MAP_SHARED|MAP_ANONYMOUS选项mmap一块匿名内存,fork之后,其子孙进程之间就能共享这块内存.这种共享内存由于受到进程父子关系的限制,一般较少使用:3.mmap文件.多个进程mmap到同一个文件,实际上就是大家在共享文件page cache中的内存.不过文件牵涉到

Linux 进程间共享内存 SYSTEMV

#include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, int size, int shmflag) key取值为IPC_PRIVATE时,shmflag应为IPC_CREAT,则新建共享内存key取值不为IPC_PRIVATE则应为已创建的key值,shmflag不应包含IPC_CREAT和IPC_EXCL,且大小小于等于原共享内存大小成功则返回共享内存id,失败返回-1 void *shmat(int sh

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

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