教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 行业资料 >

windows下进程间通信总结

来源:网络收集 时间:2026-06-23
导读: 进程是可运行的程序的实例,包含两部分,一部分是操作系统用来管理进程的内核对象,一部分是创建时系统分配的资源,主要是内存地址空间。它是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等

进程是可运行的程序的实例,包含两部分,一部分是操作系统用来管理进程的内核对象,一部分是创建时系统分配的资源,主要是内存地址空间。它是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。多进程/多线程是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字,全部文档内容请下载后查看。喜欢就下载吧 ……

windows下进程间通信总结.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/2275477.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)