前言
在window上面模拟两个程序之间数据的传递,上篇文章采用的是socket编程的方式,今天采取window共享内存的方式。采取共享内存方式好处把,也没发现有什么特殊的,可能就和共享的文件名有关关系吧,可以采取多个文件名,实现多个进程之间的通信把。
话不多收上传代码,做个记录
下面这个程序运行后作为向共享内存中写入数据
#include <windows.h>
#include <stdio.h>
#define BUF_SIZE 1025
char szName[] = "NameOfMappingObject"; // 共享内存的名字
int main()
{
// 创建共享文件句柄
HANDLE hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // 物理文件句柄
NULL, // 默认安全级别
PAGE_READWRITE, // 可读可写
0, // 高位文件大小
BUF_SIZE, // 地位文件大小
szName // 共享内存名称
);
if(hMapFile == NULL){
printf("share memory create fail\n");
return -1;
}
// 映射缓存区视图 , 得到指向共享内存的指针
char *pBuf = (char *)MapViewOfFile(
hMapFile, // 共享内存的句柄
FILE_MAP_ALL_ACCESS, // 可读写许可
0,
0,
BUF_SIZE
);
while(1)
{
printf("please input data.....\n");
char input_data_buff[BUF_SIZE] = {0};
gets(input_data_buff); // 其实gets并不安全
strncpy(pBuf, input_data_buff, BUF_SIZE - 1);
pBuf[BUF_SIZE - 1] = '\0';
}
// 解除文件映射
UnmapViewOfFile(pBuf);
// 关闭内存映射文件对象句柄
CloseHandle(hMapFile);
return 0;
}
下面这个程序运行后作为从共享内存中读出数据,按回车读取
#include <windows.h>
#include <stdio.h>
#define BUF_SIZE 1025
char szName[] = "NameOfMappingObject"; // 共享内存的名字
int main()
{
// 创建共享文件句柄
HANDLE hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // 物理文件句柄
NULL, // 默认安全级别
PAGE_READWRITE, // 可读可写
0, // 高位文件大小
BUF_SIZE, // 地位文件大小
szName // 共享内存名称
);
if(hMapFile == NULL){
printf("share memory create fail\n");
return -1;
}
// 映射缓存区视图 , 得到指向共享内存的指针
char *pBuf = (char *)MapViewOfFile(
hMapFile, // 共享内存的句柄
FILE_MAP_ALL_ACCESS, // 可读写许可
0,
0,
BUF_SIZE
);
while(1)
{
printf("press any button to receive data..." );
getchar();
printf("buff is %s\n",pBuf );
memset(pBuf,0,sizeof(pBuf));
}
// 解除文件映射
UnmapViewOfFile(pBuf);
// 关闭内存映射文件对象句柄
CloseHandle(hMapFile);
return 0;
}
向共享内存中写入hello world
接下来,到第二个窗口按下回车读出内存中数据
OK,完成!!!