在两个进程间通信

进程1的数据有时需要发送给进程B,这可以通过内存映射实现。

主要用到的函数:

1.首先在一个进程里用CreateFileMapping创建一个新的文件映射内核对象。

HANDLE CreateFileMapping(

HANDLE hFile,         //物理文件句柄,一般将它设置成为 0xFFFFFFFF(INVALID_HANDLE_VALUE)创建一个物理文件无关的内存映射就可以了

LPSECURITY_ATTRIBUTES lpAttributes,                            //安全设置,一般设置NULL使用默认的安全配置

DWORD flProtect,                              //保护设置,下述常数之一:PAGE_READONLY 以只读方式打开映射,PAGE_READWRITE 以可读、可

//写方式打开映射,PAGE_WRITECOPY 为写操作留下备份

DWORD dwMaximumSizeHigh,          //文件映射的最大长度的高32位,一般设为0,用低32位一般就够用了

DWORD dwMaximumSizeLow,           //文件映射的最大长度的低32位

LPCTSTR lpName                               //共享内存名称,其他进程可用这个名字来访问这个文件映像

);

函数调用成功就返回一个句柄,后面会继续用到。

2.在该进程将文件映射到一个进程的地址空间上

LPVOID WINAPI MapViewOfFile(

__in HANDLE hFileMappingObject,         //CreateFileMapping()返回的文件映像对象句柄

__in DWORD dwDesiredAccess,              //与CreateFileMapping()函数所设置的保护属性相匹配

__in DWORD dwFileOffsetHigh,                //文件映射起始偏移的高32位

__in DWORD dwFileOffsetLow,                 //文件映射起始偏移的低32位

__in SIZE_T dwNumberOfBytesToMap     //指定映射文件的字节数

);

3.在另一个进程里用OpenFileMapping打开已经创建的文件映像

例子:

进程1中创建映像,并发送数据

//创建文件映像对象
	HANDLE hMapping;
	LPSTR StrData;
	hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x100,"COMMUNICATION");
	if(hMapping==NULL)
	{
		MessageBox("创建文件映像对象失败","信息提示",MB_OK);
		return;
	}
	//将文件映射到一个进程的地址空间上
	StrData=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);
	if(StrData==NULL)
	{
		AfxMessageBox("MapViewOfFile() failed.");
		MessageBox("文件映射失败","信息提示",MB_OK);
		return;
	}
	//向映射内存写数据
	sprintf(StrData,m_StrSendData);
	//释放映像内存
	UnmapViewOfFile(StrData);

进程2里接收数据

UpdateData(TRUE);
	//创建文件映像对象
	HANDLE hMapping;
	LPSTR StrData;
	hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x100,"COMMUNICATION");
	if(hMapping==NULL)
	{
		MessageBox("创建文件映像对象失败","信息提示",MB_OK);
		return;
	}
	//将文件映射到一个进程的地址空间上
	StrData=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);
	if(StrData==NULL)
	{
		AfxMessageBox("MapViewOfFile() failed.");
		MessageBox("文件映射失败","信息提示",MB_OK);
		return;
	}
	//向映射内存写数据
	sprintf(StrData,m_StrSendData);
	//释放映像内存
	UnmapViewOfFile(StrData); 

使用完记得释放映像内存。

时间: 2024-08-07 08:39:07

在两个进程间通信的相关文章

Linux 进程间通信 消息队列 实现两个进程间通信

例子: 通过消息队列实现两个进程间通信,一个进程从终端输入数据,通过消息队列发送,另一个进程通过消息队列接收数据 文件1 创建进程1 终端输入通过消息队列发送数据 #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <s

Android进程间通信

如果想要进行IPC通信,一般写一个AIDL接口,再写一个Service子类,然后实现AIDL接口 当做IBinder返回给Activity界面层. 如果不想写AIDL接口文件,只是单线程中与Service进行通信 我们可以用Android写好的Messenger类来处理,一样能将消息传递给Service进行通信. 什么是aidl: aidl是 Android Interface definition language的缩写,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程

转:进程间通信方式

这部分参考文献2:详细内容打开链接看 程序员必须让拥有依赖关系的进程集协调,这样才能达到进程的共同目 标.可以使用两种技术来达到协调.第一种技术在具有通信依赖关系的两个进程间传递信息.这种技术称做进程间通信(interprocess communication).第二种技术是同步,当进程间相互具有合作依赖时使用.这两种类型的依赖关系可以同时存在. 一般而言,进程有单独的地址空间.我们可以了解下可执行程序被装载到内存 后建立的一系列映射等理解这一点.如此以来意味着如果我们有两个进程(进程A和进程B

进程间通信(IPC)之————管道

在Linux操作系统中,每个进程都有属于自己的运行空间,空间内存放有数据和执行代码,那么不同的进程相互之间是如何进行数据和信息的交换呢?Linux中提供了一种用于进程间通信(IPC-Inter Process Communication)最基本的机制--管道. 在Linux系统中一切皆文件,管道是一种特殊的文件,它是在内核中开辟了一块缓冲区,该缓冲区大小往往是固定的,Ubuntu中为65536也就2^16个字节也就是32K.这里值得提出的是,管道的通信是单向的,它提供了一个读端和一个写端,用函数

基于lamp+fastcgi+https搭建phpMyAdmin和wordpress

前言: lamp为网站搭建的很基本的一个架构,如果仅仅只是静态的网页文件,我们就可以通过基本的web服务器来处理.当我们需要处理动态内容时,比如把用户数据放在数据库,从数据库取出数据等等,我们就必须借助CGI连接到处理动态请求的应用.FastCGI作为一个常驻型的CGI,可以独立于apache服务,可以实现分布式的部署.接下来我们用一台 主机来搭建phpMyAdmin和wordpress,并且让wordpress实现https. 正文: 部署之前我们先简单介绍下我们用到的架构,不用多说lamp就

常见C++面试题(三)

strcpy和memcpy有什么区别?strcpy是如何设计的,memcpy呢? strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符.(保证dest可以容纳src.) memcpy提供了一般内存的复制.即memcpy对于需要复制的内容没有限制,因此用途更广. strcpy的原型是:char* strcpy(char* dest, const char* src); char * strcpy(char * dest, const

Linux下的进程通信方式(IPC)——管道通信

Unix IPC: 管道.命名管道(FIFO)      管道 1.概念 管道是单向的(半双工).先进先出.无结构的字节流,它把一个进程的输出和另一个进程的输入连接在一起. 写进程在管道的尾端写入数据,读进程在管道的首端读出数据.数据读出后将从管道中移走,其它读进程都不能再读到这些数据. 管道提供了简单的流控制机制.进程试图读一个空管道时,在数据写入管道前,进程将一直阻塞.同样,管道已经满时,进程再试图写管道,在其它进程从管道中读走数据之前,写进程将一直阻塞. 2.管道的特点 (1)单向数据通信

浅析分布式系统

作者:wadehan,腾讯后台开发高级工程师 本文转载自 腾讯云技术社区--腾云阁 https://www.qcloud.com/community. WeTest导读 我们常常会听说,某个互联网应用的服务器端系统多么牛逼,比如QQ.微信.淘宝.那么,一个互联网应用的服务器端系统,到底牛逼在什么地方?为什么海量的用户访问,会让一个服务器端系统变得更复杂?本文就是想从最基本的地方开始,探寻服务器端系统技术的基础概念. 承载量是分布式系统存在的原因 当一个互联网业务获得大众欢迎的时候,最显著碰到的技

操作系统(转)

1.什么是进程(Process)和线程(Thread)?有何区别? 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行. 进程