使用内存文件映射实现共享内存

时间:2022-03-09 10:15:40

不使用IPC中的共享内存(shm),使用内存文件映射的方式来实现共享内存

共享内存写入者:

// 使用文件内存映射进行内存共享
#include <iostream>
#include <string>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
using namespace std;

// 用户自定义的一个数据结构
struct user_st
{
int len;
char buffer[2048];
};

// 共享内存写入者
int Writer(int argc, char** argv)
{
int fd;
user_st * use_data;

// 创建并打开一个文件(如果文件存在那么清空它),用于内存共享
fd=open(argv[1],O_CREAT|O_RDWR|O_TRUNC,00777);

// 移动文件指针
lseek(fd,sizeof(user_st)-1,SEEK_SET);

// 往文件中写入数据,目的是为了让文件产生这么长的空间,否则写入读取的时候会出现错误
write(fd,"",1);

// 进行内存映射,注意参数:PROT_READ|PROT_WRITE表示可读写,MAP_SHARED表示映射内存用于共享
use_data = (user_st*) mmap( NULL,sizeof(user_st),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0 );

// 关闭文件描述符(注意,虽然文件描述符关闭了,但是映射的内存仍然可用)
// 因为在mmap的内部会增加文件对象的引用计数
close( fd );

// 往共享内存中写入数据
strcpy(use_data->buffer,"hello world!");

printf("Write data to Shared Memory!\n");

sleep(10);

// 卸载内存文件映射
munmap(use_data,sizeof(user_st));

return 0;
}

int main(int argc, char** argv) // map a normal file as shared mem:
{
return Writer(argc,argv);
}

共享内存读取者:

// 使用文件内存映射进行内存共享
#include <iostream>
#include <string>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
using namespace std;

// 用户自定义的一个数据结构
struct user_st
{
int len;
char buffer[2048];
};

// 共享内存读取者
int Reader(int argc, char** argv)
{
int fd;

user_st *use_data;

// 打开文件
fd=open( argv[1],O_CREAT|O_RDWR,00777 );

// 进行内存映射,映射的大小是sizeof(user_st)
use_data = (user_st*)mmap(NULL,sizeof(user_st),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

// 关闭文件
close(fd);

// 读取共享内存
printf( "buffer: %s;\n",use_data->buffer );

// 卸载内存映射
munmap( use_data,sizeof(user_st) );
}

int main(int argc, char** argv) // map a normal file as shared mem:
{
return Reader(argc,argv);
}