不使用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);
}