热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++共享内存实验例程

服务端:#include#include#includeusingnamespacestd;#defineMAP_PRE

服务端:

#include
#include
#include
using namespace std;
#define MAP_PREFIX L"Local\\"
#define MAP_NAME L"SampleMap"
#define FULL_MAP_NAME MAP_PREFIX MAP_NAME
#define MAP_SIZE 65536
#define VIEW_OFFSIZE 0
#define VIEW_SIZE 1024
#define MESSAGE L"Message from the first process."
struct STUDENT
{
int age;
int sex;
int classes;
int parent;
};
typedef struct TEST
{
BOOL bOK;
int num;
char a[20]; //使用指针的时候在读取会出错
STUDENT student[2];
}*LPTEST;
int main()
{
HANDLE hMapFile = NULL;
/*PVOID pView = NULL;*/
LPTEST pTest = NULL;
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
MAP_SIZE,
FULL_MAP_NAME
);
if (hMapFile == NULL)
{
wprintf(L"CreateFileMapping failed");
goto Cleanup;
}
wprintf(L"The file mapping(%s) is created\n", FULL_MAP_NAME);
//pView = MapViewOfFile(
// hMapFile,
// FILE_MAP_ALL_ACCESS,
// 0,
// VIEW_OFFSIZE,
// VIEW_SIZE
//);
//if (pView == NULL)
//{
// wprintf(L"MapViewOfFile failed");
// goto Cleanup;
//}
pTest = (LPTEST)MapViewOfFile(
hMapFile,
FILE_MAP_ALL_ACCESS,
0,
VIEW_OFFSIZE,
/*VIEW_SIZE*/
sizeof(LPTEST)
);
if (pTest == NULL)
{
wprintf(L"MapViewOfFile failed");
goto Cleanup;
}
wprintf(L"The file view is mapped\n");
//PWSTR pszMessage = MESSAGE;
//DWORD cbMessage = (wcslen(pszMessage) + 1) * sizeof(*pszMessage);
//memcpy_s(pView, VIEW_SIZE, pszMessage, cbMessage);
//wprintf(L"This message is written to the view:\n\"%s\"\n", pszMessage);
pTest->bOK = TRUE;
pTest->num = 3;
char* p = "abecdfa";
STUDENT* pStudent = new STUDENT[2];
pStudent[0].age = 13;
pStudent[0].classes = 3;
pStudent[0].parent = 2;
pStudent[0].sex = 0;
pStudent[1].age = 12;
pStudent[1].classes = 1;
pStudent[1].parent = 2;
pStudent[1].sex = 1;
memcpy(pTest->student, pStudent,sizeof(STUDENT)*2);
strcpy(pTest->a, p);
cout <bOK < cout <num < cout <a < cout <student[0].age <<"," <student[0].classes <<","<student[0].parent <<","<

student[0].sex < cout <student[1].age <<"," <student[1].classes <<","<student[1].parent <<","<

student[1].sex < wprintf(L"Press ENTER to clean up resources and quit");
getchar();
Cleanup:
if (hMapFile)
{
//if (pView)
//{
// UnmapViewOfFile(pView);
// pView = NULL;
//}
if (pTest)
{
UnmapViewOfFile(pTest);
pTest = NULL;
}
CloseHandle(hMapFile);
hMapFile = NULL;
}
return 0;
}

客户端:

#include
#include
#include
using namespace std;
#define MAP_PREFIX L"Local\\"
#define MAP_NAME L"SampleMap"
#define FULL_MAP_NAME MAP_PREFIX MAP_NAME
#define VIEW_OFFSET 0
#define VIEW_SIZE 1024
struct STUDENT
{
int age;
int sex;
int classes;
int parent;
};
typedef struct TEST
{
BOOL bOK;
int num;
char a[20];
STUDENT student[2];
}*LPTEST;
int main()
{
HANDLE hMapFile = NULL;
/*PVOID pView = NULL;*/
LPTEST pTest = NULL;
hMapFile = OpenFileMapping(
FILE_MAP_READ | FILE_MAP_WRITE,
FALSE,
FULL_MAP_NAME
);
if (hMapFile == NULL)
{
wprintf(L"OpenFileMapping failed");
goto Cleanup;
}
wprintf(L"The file mapping(%s) is opened\n", FULL_MAP_NAME);
//pView = MapViewOfFile(
// hMapFile,
// FILE_MAP_READ,
// 0,
// VIEW_OFFSET,
// VIEW_SIZE
//);
//if (pView == NULL)
//{
// wprintf(L"MapViewOfFile failed");
// goto Cleanup;
//}
pTest = (LPTEST)MapViewOfFile(
hMapFile,
FILE_MAP_READ|FILE_MAP_WRITE,
0,
VIEW_OFFSET,
/*VIEW_SIZE*/
sizeof(LPTEST)
);
if (pTest == NULL)
{
wprintf(L"MapViewOfFile failed");
goto Cleanup;
}
pTest->bOK = FALSE;
wprintf(L"The file view is mapped\n");

//wprintf(L"Read from the file mapping:\n\"%s\"\n", (PWSTR)pView);
cout <bOK < cout <num < cout <a < cout <student[0].age <<"," <student[0].classes <<"," <student[0].parent <<"," <student[0].sex < cout <student[1].age <<"," <student[1].classes <<"," <student[1].parent <<"," <student[1].sex < wprintf(L"Press ENTER to clean up resources and quit");
getchar();
Cleanup:
if (hMapFile)
{
//if (pView)
//{
// UnmapViewOfFile(pView);
// pView = NULL;
//}
if (pTest)
{
UnmapViewOfFile(pTest);
pTest = NULL;
}
CloseHandle(hMapFile);
hMapFile = NULL;
}

return 0;
}

 



推荐阅读
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 如何在跨函数中使用内存?
    本文介绍了在跨函数中使用内存的方法,包括使用指针变量、动态分配内存和静态分配内存的区别。通过示例代码说明了如何正确地在不同函数中使用内存,并提醒程序员在使用动态分配内存时要手动释放内存,以防止内存泄漏。 ... [详细]
author-avatar
你去过的地方叫远方
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有