IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 多进程使用共享内存 -> 正文阅读

[C++知识库]多进程使用共享内存

目录

创建共享内存

读/写其他进程创建出来的共享内存


创建共享内存

#include <Windows.h>
#include <stdio.h>

struct  Test
{
	char name[100];
	int age;
}test;

HANDLE hMutex;
int main()
{
	if ((hMutex=OpenMutex(MUTEX_ALL_ACCESS, false, "MyMutex")) == nullptr)
	{
		hMutex = CreateMutex(0, false, "MyMutex");
	}
	strcpy(test.name,"zhagnsan");
	test.age = 18;
	SECURITY_ATTRIBUTES sa;
	sa.bInheritHandle = true;
	sa.lpSecurityDescriptor = NULL;
	sa.nLength = sizeof(sa);
	//创建共享内存句柄
	//如果hFile是INVALID_HANDLE_VALUE ,调用进程还必须在dwMaximumSizeHigh和 dwMaximumSizeLow参数中指定文件映射对象的大小。在这种情况下, CreateFileMapping创建一个指定大小的文件映射对象,该对象由系统分页文件支持,而不是由文件系统中的文件支持。
	//为指定文件创建或打开命名或未命名文件映射对象
	HANDLE hFileHandle = CreateFileMapping(INVALID_HANDLE_VALUE, &sa, PAGE_READWRITE, 0, sizeof(Test), "MyFile");
	printf("hFileHandle=%d\n",hFileHandle);
	//在调用进程的地址空间映射一个文件视图
	char* sharedMemory = (char*)MapViewOfFile(hFileHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);	
	//使用互斥对象保证同一时刻只允许一个进程读或写共享内存
	WaitForSingleObject(hMutex, INFINITE);
	memcpy(sharedMemory, &test, sizeof(Test));
	ReleaseMutex(hMutex);
	UnmapViewOfFile(sharedMemory);	//从调用进程的地址空间取消映射文件的映射视图

	

	//直接将文件映射对象句柄传给其他进程
	//char cmd[1024];
	//sprintf(cmd, "%i", hFileHandle);
	//STARTUPINFOA startupInfo = {0};
	//startupInfo.cb = sizeof(startupInfo);
	//PROCESS_INFORMATION processInfo = {0};
	//delete count;
	//count = nullptr;
	//if (!CreateProcess("D:\\MyCode\\win32\\共享内存\\Debug\\共享内存2.exe", cmd, 0, 0, true, CREATE_NEW_CONSOLE, 0, 0, &startupInfo, &processInfo))
	//{
	//	printf("CreateProcess failed\n");
	//}
	//else
	//{
	//	printf("CreateProcess sucessed\n");
	//}

	
	
	//CloseHandle(hFileHandle);
	getchar();
	return 0;
}

读/写其他进程创建出来的共享内存

#include <Windows.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
using namespace std;
struct  Test
{
	char name[100];
	int age;
}test;
HANDLE hMutex;
int main(int argc,char** argv)
{
	if ((hMutex=OpenMutex(MUTEX_ALL_ACCESS, false, "MyMutex")) == nullptr)
	{
		hMutex = CreateMutex(0, false, "MyMutex");
	}
	//HANDLE hFileHandle = (HANDLE)(atol(argv[0]));
	HANDLE hFileHandle = OpenFileMapping(FILE_MAP_ALL_ACCESS, true, "MyFile");
	printf("fileHandle=%d\n",hFileHandle);
	char* sharedMemory = (char*)MapViewOfFile(hFileHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
	WaitForSingleObject(hMutex, INFINITE);
	ofstream fileStream("C:\\Users\\Administrator\\Desktop\\test.txt", ios_base::app);
	for (int i = 0; i < 10; i++)
	{
		memcpy(&test, sharedMemory, sizeof(test));	
		//printf("name=%s\nage=%d\n", test.name, test.age);	
		fileStream << GetCurrentProcessId()<<"\t"<<GetCurrentThreadId()<<"\t"
			<<test.age 
			<< endl<<flush;
		//修改共享内存数据
		test.age += 1;
		memcpy(sharedMemory, &test, sizeof(test));
		Sleep(100);
	}
	fileStream << "----------------------------------\n";
	fileStream.close();
	
	ReleaseMutex(hMutex);

	//getchar();
	return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-12 16:18:51  更:2022-05-12 16:19:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 8:48:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码