c++共享内存(一):用CreateFileMapping实现的程序A放数据,程序B取数据
最新学习共享内存,网上查看了一些资料,自己写了个demo,在此记录一下,欢迎各位路过的大神提供宝贵意见及建议_
程序分为CreateFileMapping_ProgramA和CreateFileMapping_ProgramB两个,
1.程序A和B同时创建了名为NameOfMappingObject的共享内存
【注:两个程序中的共享内存名必须相同,否则无法共同访问该内存!】
2.程序A接受到用户输入的字符串后存放到共享内存中
3.程序B收到用户输入任意字符的操作之后会从共享内存中读取该字符串并显示在控制台中。
程序A代码如下:
// CreateFileMapping_ProgramA.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include<iostream>
#include <windows.h>
using namespace std;
#define BUF_SIZE 1024
TCHAR cstrSzName[] = L"NameOfMappingObject";//共享内存名
int main()
{
//1.创建共享文件句柄 hMapFile,CreateFileMapping()函数创建一个文件映射内核对象
HANDLE hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, //物理文件句柄,设为INVALID_HANDLE_VALUE(无效句柄)以创建一个进程间共享的对象
NULL, //默认安全级别
PAGE_READWRITE, //权限可读可写
0, //高位文件大小
BUF_SIZE, //低位文件大小
cstrSzName //共享内存名
);
//2.获取指向文件视图的指针 pBuf,MapViewOfFile()函数负责把文件数据映射到进程的地址空间
char *pBuf = (char*)MapViewOfFile(
hMapFile, //共享内存的句柄
FILE_MAP_ALL_ACCESS, //可读写
0,
0,
BUF_SIZE
);
//3.将数据放到共享内存
while (true)
{
cout << "input..." << endl;
char szInfo[BUF_SIZE] = { 0 };
gets_s(szInfo,BUF_SIZE);//c++11中用gets_s() 代替gets()
memcpy(pBuf, szInfo, BUF_SIZE - 1);
pBuf[BUF_SIZE - 1] = '\0';
// 程序B显示共享内存中的数据
// cout << "press any key to receive data..." << endl;
// getchar();
// cout << pBuf << endl;
}
//4.撤销文件视图UnMapViewOfFile()
UnmapViewOfFile(pBuf);
//5.关闭映射文件句柄CloseHandle()
CloseHandle(hMapFile);
return 0;
}
程序B代码如下:
// CreateFileMapping_ProgramB.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include<iostream>
#include <windows.h>
using namespace std;
#define BUF_SIZE 1024
TCHAR cstrSzName[] = L"NameOfMappingObject";
int main()
{
//1.创建共享文件句柄 hMapFile,CreateFileMapping()函数创建一个文件映射内核对象
HANDLE hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, //物理文件句柄,设为INVALID_HANDLE_VALUE(无效句柄)以创建一个进程间共享的对象
NULL, //默认安全级别
PAGE_READWRITE, //权限可读可写
0, //高位文件大小
BUF_SIZE, //低位文件大小
cstrSzName //共享内存名
);
//2.获取指向文件视图的指针 pBuf,MapViewOfFile()函数负责把文件数据映射到进程的地址空间
char *pBuf = (char*)MapViewOfFile(
hMapFile, //共享内存的句柄
FILE_MAP_ALL_ACCESS, //可读写
0,
0,
BUF_SIZE
);
//3.将数据放到共享内存
while (true)
{
//程序A将数据放到共享内存的地址中
// cout << "input..." << endl;
// char szInfo[BUF_SIZE] = { 0 };
// gets_s(szInfo, BUF_SIZE);//c++11中用gets_s() 代替gets()
// memcpy(pBuf, szInfo, BUF_SIZE - 1);
// pBuf[BUF_SIZE - 1] = '\0';
//程序B显示共享内存中的数据
cout << "press any key to receive data..." << endl;
getchar();
cout << pBuf << endl;
}
//4.撤销文件视图UnMapViewOfFile()
UnmapViewOfFile(pBuf);
//5.关闭映射文件句柄CloseHandle()
CloseHandle(hMapFile);
return 0;
}
程序运行结果:
1.程序A和B启动画面:
2.程序A输入:我是程序A
程序B输入回车后显示:我是程序A
结果画面如下: