文档章节

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

mickelfeng
 mickelfeng
发布于 2017/09/11 16:05
字数 694
阅读 39
收藏 0

 文件内存映射(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);  
}  

 

本文转载自:http://blog.csdn.net/nb_vol_1/article/details/51916563

共有 人打赏支持
mickelfeng

mickelfeng

粉丝 227
博文 2584
码字总数 562007
作品 0
成都
高级程序员
进程通信:共享内存

1.System V共享内存: 系统V共享内存指的是把所有共享数据放在共享内存区域(IPC shared memory region),任何想要访问该数据的进程都必须在本进程的地址空间新增一块内存区域,用来映射存放...

满小茂
2016/10/22
23
0
Linux进程间通信源码剖析,共享内存(shmget()、shmat()、shmdt()及shmctl())

地址:http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index2.html 系统调用mmap()通过映射一个普通文件实现共享内存。系统V则是通过映射特殊文件系统shm中的文件实现进程间的共享...

长平狐
2012/06/12
983
0
Linux进程间通信—— 内存映射

Linux环境进程间通信(五): 共享内存(上) 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地...

li_wen01
2017/07/29
0
0
Linux环境进程间通信(五) 共享内存(下)

系统调用mmap()通过映射一个普通文件实现共享内存。系统V则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信。也就是说,每个共享内存区域对应特殊文件系统shm中的一个文件(这是...

sty124578
01/29
0
0
进程间通信学习小结(共享内存)

要使用共享内存,应该有如下步骤: 1.开辟一块共享内存 shmget() 2.允许本进程使用共某块共享内存 shmat() 3.写入/读出 4.禁止本进程使用这块共享内存 shmdt() 5.删除这块共享内存 shmctl()...

晨曦之光
2012/03/09
2.4K
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Confluence 6 使用 Fail2Ban 来限制登录尝试

什么是 Fail2Ban? 我们需要在我们网站中防止密码的暴利破解。Fail2Ban 是一个 Python 的应用来查看日志文件,使用的是正则表达式,同时还可以与Shorewall (或者 iptables)直接工作来来启用...

honeymose
3分钟前
0
0
日期和时间API - 读《Java 8实战》

日期与时间 LocalDate 创建一个LocalDate对象并读取其值 // 根据年月日创建日期LocalDate date1 = LocalDate.of(2014, 3, 18);// 读取System.out.println(date1.getYear()); // 2014Sys...

yysue
4分钟前
0
0
8月15日任务

8月15日任务 Memcached命令行 • telnet 127.0.0.1 11211 • set key2 0 30 2 ab STORED get key2 VALUE key2 0 2 ab END 实例: [root@localhost 02]# telnet 127.0.0.1 11211-bash: te......

寰宇01
16分钟前
0
0
LNMP架构(Nginx访问日志、Nginx日志切割、静态文件不记录日志和过期时间)

Nginx访问日志 1.打开配置文件,搜索log_format vim /usr/local/nginx/conf/nginx.conf 2.访问日志常用变量含义 $remote_addr : 客户端IP(公网IP) $http_x_forwarded_for : 代理服务器的IP ...

蛋黄_Yolks
16分钟前
0
0
lombok 不用再写pojo的getset

java实体类不写get/set方法 1、下载地址https://projectlombok.org/download Myeclipse、eclipse安装lombok Lombok是一种Java实用工具,可以帮助开发人员消除Java的冗长,具体看lombok的官网...

木之下
23分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部