有时候我们会遇到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;}


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

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

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

  1. 使用DLL在进程间共享数据

    0x01 DLL在进程间共享数据理论 1.可以在Dll中使用#pragma data_seg建立共享类型的数据段将需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享,从而实现不 ...

  2. 【C++】DLL内共享数据区在进程间共享数据(重要)

    因项目需要,需要在DLL中共享数据,即DLL中某一变量只执行一次,在运行DLL中其他函数时该变量值不改变:刚开始想法理解错误,搜到了DLL进程间共享数据段,后面发现直接在DLL中定义全局变量就行,当时 ...

  3. python 进程间共享数据 (二)

    Python中进程间共享数据,除了基本的queue,pipe和value+array外,还提供了更高层次的封装.使用multiprocessing.Manager可以简单地使用这些高级接口. Mana ...

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

    1.http://blog.csdn.net/morewindows/article/details/6702342 在进程间共享数据有很多种方法,剪贴板,映射文件等都可以实现,这里介绍用DLL的共享 ...

  5. 使用 WM_COPYDATA 在进程间共享数据

    开发中有时需要进程间传递数据,比如对于只允许单实例运行的程序,当已有实例运行时,再次打开程序,可能需要向当前运行的实例传递信息进行特殊处理.对于传递少量数据的情况,最简单的就是用SendMessage ...

  6. 进程间共享数据Manager

    一.前言 进程间的通信Queue()和Pipe(),可以实现进程间的数据传递.但是要使python进程间共享数据,我们就要使用multiprocessing.Manager. Manager()返回的 ...

  7. Python multiprocessing.Manager介绍和实例(进程间共享数据)

    Python中进程间共享数据,处理基本的queue,pipe和value+array外,还提供了更高层次的封装.使用multiprocessing.Manager可以简单地使用这些高级接口. Mana ...

  8. Swoole 中使用 Table 内存表实现进程间共享数据

    背景 在多进程模式下进程之间的内存是相互隔离的,在一个工作进程中的全局变量和超全局变量,在另一个工作进程中是无法读取和操作的. 如果只有一个工作进程,则不存在进程隔离问题,可以使用全局变量和超全局变量 ...

  9. linux多进/线程编程(2)—— fork函数和进程间“共享”数据

    参考: 1.博客1:https://www.pianshen.com/article/4305691855/ fork:在原进程的基础上"分叉"出一个子进程,即创建一个子进程. N ...

随机推荐

  1. Android开发——Android的消息机制详解

    )子线程默认是没有Looper的,Handler创建前,必须手动创建,否则会报错.通过Looper.prepare()即可为当前线程创建一个Looper,并通过Looper.loop()来开启消息循环 ...

  2. 算法学习记录-排序——选择排序(Simple Selection Sort)

    之前在冒泡排序的附录中提到可以在每次循环时候,不用交换操作,而只需要记录最小值下标,每次循环后交换哨兵与最小值下标的书, 这样可以减少交换操作的时间. 这种方法针对冒泡排序中需要频繁交换数组数字而改进 ...

  3. Java web 服务启动时Xss溢出异常处理笔记

    本文来自网易云社区 作者:王飞 错误日志 错误日志要仔细看,第一行不一定就是关键点,这个错误出现的时候,比较靠后,其中关键行就是下面这句. Caused by: java.lang.IllegalSt ...

  4. POJ——1364King(差分约束SPFA判负环+前向星)

    King Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11946   Accepted: 4365 Description ...

  5. 【2018.10.18】noip模拟赛Day2 地球危机(2018年第九届蓝桥杯C/C++A组省赛 三体攻击)

    题目描述 三体人将对地球发起攻击.为了抵御攻击,地球人派出了 $A × B × C$ 艘战舰,在太 空中排成一个 $A$ 层 $B$ 行 $C$ 列的立方体.其中,第 $i$ 层第 $j$ 行第 $k ...

  6. COdevs 天梯 水题系列

    1203 判断浮点数是否相等 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题目描述 Description 给出两个浮点数,请你判断这两个浮点数是否相等 输入 ...

  7. 【Tomcat】linux下实时查看tomcat运行日志

    今天在部署一个项目到linux服务器的时候一直报错,可是在日志文件中也没有记录.但是在本地测试的时候都没有错误,在windoesServer服务器上也没错误,实在找不到原因,因此想的实时查看tomca ...

  8. CodeForces 379D 暴力 枚举

    D. New Year Letter time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  9. Perl语言入门--1--perl的包安装

    A.  手工安装 从CPAN下载了DBI模块1.13版的压缩文件DBI-1.13.tar.gz.假设放在/usr/local/src(一般需要编译安装的软件,都放在此目录下安装). # cd /usr ...

  10. mongodb的入门学习

    mongodb的入门学习 简介: MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库 ...