windows下进程间通信总结
进程是可运行的程序的实例,包含两部分,一部分是操作系统用来管理进程的内核对象,一部分是创建时系统分配的资源,主要是内存地址空间。它是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。多进程/多线程是Windows操作系统的一个基本特征。Microsoft Win32应用编程接口(Application Programming Interface, API)提供了大量支持应用程序间数据共享和交换的机制,这些机制行使的活动称为进程间通信(InterProcess Communication, IPC),进程通信就是指不同进程间进行数据共享和数据交换。
通常在Windows中实现进程间的通信方法是:
文件映射(Memory-Mapped Files)、共享内存(Shared Memory)、匿名管道(Anonymous Pipe)、命名管道(Named Pipe)、邮件槽(Mailslots)、剪贴板(Clipped Board)、动态数据交换(DDE)、动态链接库(DLL) 、对象链接与嵌入(OLE)、NetBios函数、Sockets和WM_COPYDATA消息。
文件映射能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容。Win32 API允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针。通过使用这些指针,不同进程就可以读或修改文件的内容,实现了对文件中数据的共享。应用程序有三种方法来使多个进程共享一个文件映射对象:1)继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄。2)命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。另外,第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程。3)句柄复制:第一个进程建立文件映射对象,然后通过其它IPC机制(有名管道、邮件槽等)把对象句柄传递给第二个进程。第二个进程复制该句柄就取得对该文件映射对象的访问权限。文件映射是在多个进程间共享数据的非常有效方法,有较好的安全性。但文件映射只能用于本地机器的进程之间,不能用于网络中,而开发者还必须控制进程间的同步。
具体定义:
(1) 创建用于内存映射访问的文件
要创建或打开一个用于内存映射访问的文件,需要通过CreateFileForMapping函数来实现,它是CreateFile函数的一个特殊版本,专门提供给内存映射文件使用,CreateFileForMapping函数的定义如下:
HANDLE CreateFileForMapping (
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
(2) 创建或打开内存映射文件对象
在使用内存映射文件时,需要创建或打开内存映射文件对象,它实际上是于已经创建或打开的文件建立连接。创建或打开内存映射对象通过CreateFileMapping函数实现,此函数定义如下:
HANDLE CreateFileMapping(
HANDLE hFile,
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCTSTR lpName
);
成功创建内存映射文件对象,函数将返回一个内存映像对象句柄,如果在创建内存映射文件对象已存在,将直接返回已打开的内存映像文件对象句柄。
(3) 获取内存映像文件对象视图
当创建或打开了内存映射对象之后。接着就需要得到内存映射文件对象的数据内存指针,通过此指针则可以读写文件中的内容,也就是获取内存映射文件对象视图。得到内存映射文件对象的数据内存指针通过MapViewOfFile函数实现,此函数定义如下:
LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap
);
函数返回值指向映射文件的内存指针。
(4) 取消文件视图的映射
在使用完内存映射文件之后,还要调用UnmapViewOfFile函数取消文件视图,进行内存清理工作。此函数定义如下:
BOOL UnmapViewOfFile(
LPCVOID lpBaseAddress
);
共享内存实际就是文件映射的一种特殊情况。进程在创建文件映射对象时用0xFFFFFFFF来代替文件句柄(HANDLE),就表示了对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是用文件映射实现的,所以它也有较好的安全性,也只能运行于同一计算机上的进程之间。
具体方法:
在两进程中同时有以下语句
HANDLE hShared ; ∥全局变量
∥生成文件映象并返回句柄
hShared = ∷CreateFileMapping ( (HANDLE) Ox¯¯¯¯ , (LPSECURITY ATTRIBUTES)NULL ,PAGE READWRITE ,0 ,1024 ,“Shared Memory of Winsock”) ;
∥分配文件视图的内存块。
char XpShared = ( char X ) ∷MapViewOfFile ( hShared , FILE MAP ALL
ACCESS ,0 ,0 ,1024) ;
此时两进程获得指向同一段内存的指针,都可以在其中写入和读出,取实现了数据共享。此时应该注意两进程的同步问题。内存不再使用时应调用以下函数消除文件视图和关闭文件映象对象:
∷UnmapViewOfFile (hShared) ;
∷CloseHandle (hShared) ;
管道(Pipe)是一种具有两个端点的通信通道:有一端句柄的进程可以和有另一端句柄的进程通信。管道可以是单向-一端是只读的,另一端点是只写的;也可以是双向的一管道的两端点既可读也可写。
匿名管道是在父进程和子进程之间,或同一父进程的两个子进程之间传输数据的无名字的单向管道。通常由父进程创建管道,然后由要通信的子进程继承通道的读端点句柄或写 端点句柄,然后实现通信。父进程还可以建立两个或更多个继承匿名管道读和写句柄的子进程。这些子进程可以使用管道直接通信,不需要通过父进程。它是单机上实现子进程标准I/O重定向的有效方法,它不能在网上使用,也不能用于两个不相关的进程之间。
具体方法如下:
//创建管道
HANDLE hReadPipe;
HANDLE hWritePipe;
SECURITY_ATTRIBUTES sat; //安全属性结
sat.nLength = sizeof(SECURITY_ATTRIBUTES); //结构体大小
sat.bInheritHandle = true; //指出安全描述符的对象能否被新进程继承 sat.lpSecurityDescriptor = NULL; //安全描述符,NULL: 使用默认的 if( !CreatePipe(&hRead,&hWrite,&sa,0))
{
MessageBox(_T("Create Pipe Error!"));
return;
}
//创建进程
STARTUPINFO startupinfo; //进程信息
PROCESS_INFORMATION pinfo;
startupinfo.cb = sizeof( STARTUPINFO ); //结构体大小
GetStartupInfo( &startupinfo ); //获取当前进程的信息
startupinfo.hStdError = hWritePipe;
startupinfo.hStdOutput = hReadPipe;
startupinfo.dwFlags = STARTF_USESHOWWINDOW |
STARTF_USESTDHANDLES;
startupinfo.wShowWindow = SW_HIDE;
if( !CreateProcess(NULL, "D://aa …… 此处隐藏:13436字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [行业资料]创设有效语境 改善英语教学
- [行业资料]微商推广引流的44种方法
- [行业资料]医疗机构输血科血库基本标准
- [行业资料]锂离子电池项目可行性研究报告(2015年
- [行业资料]申请执行人长沙市开福区人口和计划生育
- [行业资料]倾听草木的呼吸(初中阅读)
- [行业资料]长沙新环境厂房租赁合同书
- [行业资料]2022年经济师《金融专业知识与实务(中
- [行业资料]浦东新区2009学年度第二学期期末考试七
- [行业资料]企业劳动用工协议书
- [行业资料]最新苏科版七年级数学上册第二章有理数
- [行业资料]12星座与英语词汇学习
- [行业资料]2008年高考化学科经验
- [行业资料]镇政府2015年工作总结及2016年政府工作
- [行业资料]梧州市产业园区规划及招商引资报告
- [行业资料]大体积砼承台施工作业指导书
- [行业资料]学生干部在创建和谐校园中的作1
- [行业资料]小学语文教师实习个人总结
- [行业资料]2014完美最新奖金制度
- [行业资料]2016年一建建筑实务-重要知识点地质
- 【最新】人教版小学语文三年级上册:第
- 中国中小企业年鉴(地区数据)
- 动物与人类生活的关系 ppt
- 选修3 专题3 胚胎工程知识点
- 遥感技术基础复习题
- 公司员工职业生涯规划实施方案
- 辽宁省建筑施工企业安全生产许可证管理
- 15秋福师《中外幼儿教育史》在线作业二
- 2015-2020年中国网络视频行业深度调研
- 数学八年级下华东师大版21.1算术平均数
- 苏教版一年级语文下册《小松树和大松树
- 油画论文:摄影对当下油画艺术的影响
- 西方自由主义影响下的新闻自由——从17
- 基于支持向量机的商业银行信用风险评估
- 机械设计基础复习题答案(修改)(1)
- 语文:高考作文素材:材料引用及论点论
- 月份工程进度款结算单62+56
- 2018-2023年中国互联网基金行业现状研
- 人教版 PEP 五年级下册Unit1Lesson1 th
- 2014学年第二学期四年级数学期末教学质




