第5章进程间通信

第5章进程间通信

ID:37718737

大小:37.36 KB

页数:11页

时间:2019-05-29

第5章进程间通信_第1页
第5章进程间通信_第2页
第5章进程间通信_第3页
第5章进程间通信_第4页
第5章进程间通信_第5页
资源描述:

《第5章进程间通信》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第5章进程间通信为了实现特殊的目的,系统编程时往往使用多个进程,这些进程往往会使用动态链接库为纽带,实现进程间的数据通信。进程间的数据通信方法有很多,如果只是一个简单的通知事件,可以采用Win32提供的系统对象比如信号灯、互斥、关键临界区、事件等。如果需要大量的数据通信,而又不在乎速度和性能,适时性要求不高可以采用文件、注册表和WindowsNT提供的事件日志等。对于适时性要求较高的场合,可以采用创建内存共享文件、创建管道、邮槽,通过窗口消息来实现消息共享。对于远程的应用程序,还可以通过socket和有关网络协议实现通信。前面已经提

2、到了多种方法,比如内存共享文件、动态链接库的共享节等,这里主要介绍系统内核对象的应用以及其他几种进程间通信的方法。5.1只启动一份程序实例只保留一份应用程序实例的目的是显而易见的,它主要是防止在多个实例加载的系统中造成资源浪费,同时也可以避免多个实例存取同一系统对象造成的各种冲突。为了只允许运行程序的一个实例,往往需要在程序运行时,对系统进行检查,发现已经有一个实例存在就立即退出。由于每一个进程启动时都会有一个进程标识,有时会创建自己的主窗口,在注册表或者系统文件中写入一些标记信息,有时也会创建一些系统对象,这些信息都可以作为查找前

3、面一个实例存在的标志。前面介绍进程枚举时提到了通过进程枚举得到各个进程标识,进而得到进程名称的实现。实际上这个过程本身就可以作为查找应用程序实例的一种方法。一般地,用户会尽可能地避免修改可执行文件的名称,而进程文件名称重名的几率虽然存在,但是非常小,通过进程名称查找仍然是非常有效的。当然了这种方法极其繁琐,一方面它要处理WindowsNT4和Windows9x之间的差异;另一方面,进程的枚举也不是一件轻松的任务。所以这种方法的应用不是很多。通过窗口查找应该是一个简单易行的办法,因为大部分基于GUI实现的应用程序都会创建自己的窗口,这

4、些窗口类名和窗口标题完全相同的几率很低,使用这种方法应该是简单有效的。Windows提供的FindWindow和FindWindowEx两个函数可以根据窗口类名和窗口标题来查找是否存在一个指定特征的窗口,以此来作为进程是否存在的标志。比如InternnetExplorer程序和Shell进程都有其独特的特征。利用这些特征来判断进程实例的存在是非常有效的,而且这种方法不需要创建任何系统内核对象。但是这种方法有一个很大的局限性,就是如果一个程序运行时没有窗口消息循环,这种方法就会失效。使用内核对象来识别程序实例是最精确的,相当于DNA鉴

5、定,下面是一段采用互斥内核对象实现的,同样用户还可以使用事件、原子等对象。例5-1通过互斥对象实现惟一实例进程。HANDLECreateOneAppMutex(LPCTSTRlpName){HANDLEhMutex;//CreatemutexhMutex=CreateMutex(NULL,TRUE,lpName);switch(GetLastError()){caseERROR_SUCCESS:break;//互斥对象创建成功,没有实例运行CaseERROR_ALREADY_EXISTS:hMutex=NULL;break;//互斥

6、对象已经存在,程序的一个实例正在运行default:break;}//由于某个原因可能无法创建实例returnhMutex;}这种方法实现的原理是基于所有系统内核对象不允许两个重名的对象共存。它实现的原理是,每个进程启动时首先根据系统的对象(事件、互斥、原子)检查该名称标识的对象是否存在。如果不存在,就创建该对象;否则直接退出。在程序退出时,系统会释放该系统对象。显然这种方法的准确性是无庸置疑的,但是使用这种方法有一定的风险,因为系统的对象的创建和释放是通过两个步骤实现的。如果在进程运行期间,系统异常退出,那么系统内核对象回收就无法

7、实现。这样已经创建的对象将一致保持到系统注销或者重新启动时为止,除非用户采用其他方法关闭该内核对象。否则,可以设想进程本来已经异常终止,但是它申请创建的内核对象却没有释放,检查时这个对象仍然存在,这样很有可能进程将无法创建一个惟一的实例。5.2使用共享内存实现进程间通信尽管进程间通信的方法有多种,但是对于单机而言,最底层共享的机制是内存共享文件。上面提到的多种方法都是基于内存共享文件实现的。使用内存共享文件可以提高共享的性能,降低系统开销。使用内存共享文件实现进程共享是基于同一文件映射对象的视图来实现的,各个进程会共享同一物理存储器

8、的同一个页面,任何一个进程对该共享文件对象的修改都会同时影响其他进程对该对象的映射,它们会立即看到修改进程对共享内存对象的变更。使用内存共享文件实现共享数据,一般都会创建一个名称字符串标识的共享内存对象。创建的方法是调用CreateF

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。