使用内存文件映射实现共享内存
使用内存文件映射实现共享内存
mickelfeng 发表于3个月前
使用内存文件映射实现共享内存
  • 发表于 3个月前
  • 阅读 32
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

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

 文件内存映射(mmap)

// 文件内存映射
#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;

// 主函数
int main(int argc,char* argv[])
{
    // 文件描述符
    int fd;

    // 文件映射的地址
    void *addr;

    // 文件状态信息
    struct stat f_st;

    // 打开一个文件
    fd = open("1.txt", O_RDONLY);

    // 得到文件的状态信息,目的是为了下一步取得文件大小
    fstat(fd, &f_st);

    // 进行文件内存映射
    addr = mmap(NULL, f_st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);

    /* 判断是否映射成功 */
    if(addr == MAP_FAILED)
        return -1;

    // 打印文件的内容
    printf("%s", addr);

    /* 解除映射 */
    munmap(addr, f_st.st_size);

    close(fd);
}

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

 

共有 人打赏支持
mickelfeng
粉丝 214
博文 904
码字总数 506377
×
mickelfeng
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: