windows核心编程之进程间共享数据

有时候我们会遇到window进程间共享数据的需求,例如说我想知道系统当前有多少某个进程的实例。

我们能够在程序中定义一个全局变量。初始化为0。每当程序启动后就加1。当然我们我们能够借助第三方介质来储存这个变量,然后解析。

这样做必须做到先写入后解析。不能实时更新数据。假设不考虑其它储存介质。仅仅是进程中的通信,应该怎么做呢?windows提供了一些可行的方法,以下介绍经常使用的两种。

一、共享数据段

#include "stdafx.h"
#include <Windows.h>

};

#pragma data_seg("Shared")
volatile int g_lAppInstances = 0 ;
#pragma data_seg()

#pragma comment(linker, "/Section:Shared,RWS")

int _tmain(int argc, _TCHAR* argv[])
{
	printf("the instance of app is %d\n", ++g_lAppInstances) ;
	getchar() ;
	return 0;
}

以上就是在代码中增加共享数据段。当执行一个程序的实例的同一时候打开还有一个实例。g_lAppInstances会指向同一个内存,这样就能够做到数据共享。可是这样的方法的缺点是仅仅能共享一个变量的数据,对于结构体是不行的。

二、内存映射文件

第一个程序:

#include "stdafx.h"
#include <Windows.h>

struct SharedData{
	int a ;
	int b;
	float c ;
	SharedData(int x, int y, float z){
		a = x ;
		b = y ;
		c = z ;
	}
};

const int BUF_SIZE = 256 ;
TCHAR szName[] = _T("Global\\MyFileMappingObj") ;

int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE,
		NULL, PAGE_READWRITE, 0, BUF_SIZE, szName) ;
	if(hMapFile == NULL){
		_tprintf(_T("Could not create file mapping obj\n")) ;
		return 1 ;
	}

	LPCTSTR pBuf = (LPCTSTR)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE) ;
	if(pBuf == NULL){
		_tprintf(_T("could not mapping file\n")) ;
		CloseHandle(hMapFile) ;
		return 2 ;
	}
	<span style="white-space:pre">	</span><pre name="code" class="cpp"><span style="white-space:pre">	</span>SharedData *pSd = (SharedData*)pBuf ;
	_tprintf(_T("the data from IPC2 is %d, %d, %f\n"), pSd->a, pSd->b, pSd->c) ;
	getchar() ;

UnmapViewOfFile(pBuf) ;CloseHandle(hMapFile) ;return 0;}


第二个程序:

#include "stdafx.h"
#include <Windows.h>

struct SharedData{
	int a ;
	int b;
	float c ;
	SharedData(int x, int y, float z){
		a = x ;
		b = y ;
		c = z ;
	}
};

const int BUF_SIZE = 256 ;
TCHAR szName[] = _T("Global\\MyFileMappingObj") ;

int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE,
		NULL, PAGE_READWRITE, 0, BUF_SIZE, szName) ;
	if(hMapFile == NULL){
		_tprintf(_T("Could not create file mapping obj\n")) ;
		return 1 ;
	}

	LPCTSTR pBuf = (LPCTSTR)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE) ;
	if(pBuf == NULL){
		_tprintf(_T("could not mapping file\n")) ;
		CloseHandle(hMapFile) ;
		return 2 ;
	}

	<pre name="code" class="cpp"><span style="white-space:pre">	</span>TCHAR s[BUF_SIZE] ;
	SharedData sd(1, 2, 3.14) ;
	memcpy((LPVOID)pBuf, &sd, sizeof(sd)) ;

UnmapViewOfFile(pBuf) ;CloseHandle(hMapFile) ;return 0;}


我们先执行第二个程序,然后再执行第一个程序,发现第一个程序打印出了第二个程序一个结构体的值,达到了数据共享的目的。

进程间的通信还包含剪切板,邮槽。管道等,可是他们本质上都是利用的内存映射文件实现的。

时间: 2024-10-03 13:46:02

windows核心编程之进程间共享数据的相关文章

利用内存映射文件在两个进程间共享数据 转

private hMapFile: THandle; MapFilePointer: Pointer; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin hMapFile := CreateFileMapping ( $FFFFFFFF, // 特殊内存映射句柄 nil, page_

python 进程间共享数据 (二)

Python中进程间共享数据,除了基本的queue,pipe和value+array外,还提供了更高层次的封装.使用multiprocessing.Manager可以简单地使用这些高级接口. Manager()返回的manager对象控制了一个server进程,此进程包含的python对象可以被其他的进程通过proxies来访问.从而达到多进程间数据通信且安全. Manager支持的类型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaph

【转】VC 利用DLL共享区间在进程间共享数据及进程间广播消息

1.http://blog.csdn.net/morewindows/article/details/6702342 在进程间共享数据有很多种方法,剪贴板,映射文件等都可以实现,这里介绍用DLL的共享区间在进程间共享数据,及共享数据有变化时及时的反馈给各相关进程. 一.在DLL中设置共享区间 在DLL中是用数据段来实现共享区间的,有了这个共享区间,各进程可以方便的共享数据. 1.先用#pragma data_seg(Name)设置名为Name的数据段. 2.再用#pragma comment(l

Android SharePreference 在主进程和次进程间共享数据不同步出错

SharedPreference作为android五大存储(网络,数据库,文件,SharedPreference,contentProvider)之中最方便使用的一个,从类名上来看就不是一个存储大数据的工具,以key/value成对的形式来存储基本数据类型,只能存储基本数据类型. 在平时的开发中偶尔会遇到SharedPreference在多进程中修改同一个值出现的问题.多进程是指在ddms中看到的不同进程,包括不同应用(不管share uid 是否相同),同一个应用中配置android:proc

C++11并发编程4------线程间共享数据

举个例子: 刚参加工作的你,只能租房住,嫌房租贵就和别人合租了,两个人住一起只有一个洗手间,每天早上起床的时候,如果你室友在洗手间,你就只能等着,如果你强行进去,那画面就不可描述了.同样的问题,如果多个线程共享一个数据,并且对数据有读有写,那就需要注意共享数据的保护了. 使用互斥量保护共享数据: 当访问共享数据前,使用互斥量奖相关数据锁住,当访问结束后,再将数据解锁.互斥量是C++中一种最通用的数据保护机制. C++中使用互斥量: 原文地址:https://www.cnblogs.com/418

并发编程(3)线程间共享数据

一.共享内存带来的问题 读时没问题,写时会有竞争问题. 二.解决方法 1.最简单的办法就是对数据结构采用某种保护机制,确保只有进行修改的线程才能看到不变量被破坏时的中间状态.从其他访问线程的角度来看,修改不是已经完成了,就是还没开始. 2.另一个选择是对数据结构和不变量的设计进行修改,修改完的结构必须能完成一系列不可分 割的变化,也就是保证每个不变量保持稳定的状态,这就是所谓的无锁编程.另一种处理条件竞争的方式是,使用事务的方式去处理数据结构的更新.(STM) 第二种是比较高阶的内容,不在讨论范

android进程间共享简单数据

我们知道,在android中,保存简单的数据最方便的就是使用SharedPreferences,然而,SharedPreferences虽然说也可以设置成进程间共享数据,但是并不可靠(更致命的是,不同级别的应用是无法使用SharedPreferences进行共享的,比如,普通应用无法读取系统应用的SharedPreferences数据). 那如何才能进行简单数据的跨进程共享呢,Settings.System可以很方便的进行跨进程共享数据,使用凡是也很简单: //往系统配置表里添加自定义数据 Se

《windows核心编程系列》十八谈谈windows钩子

windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功能.所谓的指定窗体并不局限于当前进程的窗体,也能够是其它进程的窗体.当监视的某一消息到达指定的窗体时,在指定的窗体处理消息之前,钩子函数将截获此消息,钩子函数既能够加工处理该消息,也能够不作不论什么处理继续传递该消息.使用钩子是实现dll注入的方法之中的一个.其它经常使用的方法有:注冊表注入,远程线

Windows进程间共享内存通信实例

抄抄补补整出来 采用内存映射文件实现WIN32进程间的通讯:Windows中的内存映射文件的机制为我们高效地操作文件提供了一种途径,它允许我们在WIN32进程中保留一段内存区域,把硬盘或页文件上的目标文件映射到这段虚拟内存中.注意:在程序实现中必须考虑各进程之间的同步问题. 在Windows操作系统下,任何一个进程不允许读取.写入或是修改另一个进程的数据(包括变量.对象和内存分配等),但是在某个进程内创建的文件映射对象的视图却能够为多个其他进程所映射,这些进程共享的是物理存储器的同一个页面. 因