文档章节

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

mickelfeng
 mickelfeng
发布于 2017/09/11 16:05
字数 694
阅读 39
收藏 0
点赞 0
评论 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

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

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

满小茂 ⋅ 2016/10/22 ⋅ 0

Linux进程间通信源码剖析,共享内存(shmget()、shmat()、shmdt()及shmctl())

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

长平狐 ⋅ 2012/06/12 ⋅ 0

Linux环境进程间通信(五) 共享内存(下)

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

sty124578 ⋅ 01/29 ⋅ 0

Linux进程间通信—— 内存映射

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

li_wen01 ⋅ 2017/07/29 ⋅ 0

System.IO之内存映射文件共享内存

内存映射文件是利用虚拟内存把文件映射到进程的地址空间中去,在此之后进程操作文件,就像操作进程空间里的地址一样了,比如使用c语言的memcpy等内存操作的函数。这种方法能够很好的应用在需...

长平狐 ⋅ 2012/06/08 ⋅ 0

进程间通信学习小结(共享内存)

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

晨曦之光 ⋅ 2012/03/09 ⋅ 0

Linux进程间通信-------共享内存之mmap详解

mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。 头文件...

B_ice ⋅ 2016/07/31 ⋅ 0

Linux内存管理之mmap详解

一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反...

zhangyujsj ⋅ 2016/03/12 ⋅ 0

Linux进程和线程间IPC机制

Linux进程间IPC 1.管道(Pipe)及有名管道(named pipe): 1、管道是半双工的,要实线读写需建立两根管道; 2、匿名管道用于父子进程或者兄弟进程之间(如forkexec创建的进程),命名管道允许没...

dodonei ⋅ 04/16 ⋅ 0

内存映射文件(一)

本文为 zhuweibin.com-内存映射文件(一) 的镜像文章,以防丢失,建议阅读原文。 内存映射文件(二):http://my.oschina.net/simplefocus/blog/288540 与虚拟内存相似,内存映射文件允许开...

牛肉圆粉不加葱 ⋅ 2014/07/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

linux 安装docker

通过以下命令下载安装docker wget -qO- https://get.docker.com | sh 执行以上命令后输出以下内容说明安装成功,注意红框中的内容,docker安装成功后默认只有root能使用,红框中给出的提示是...

haoyuehong ⋅ 17分钟前 ⋅ 0

482. License Key Formatting - LeetCode

Question 482. License Key Formatting Solution 思路:字符串转化为char数组,从后遍历,如果是大写字母就转化为小写字母,如果是-就忽略,如果遍历了k个字符(排除-)就追加一个-。 Java实现...

yysue ⋅ 36分钟前 ⋅ 0

聊聊spring cloud gateway的LoadBalancerClientFilter

序 本文主要研究一下spring cloud gateway的LoadBalancerClientFilter GatewayLoadBalancerClientAutoConfiguration spring-cloud-gateway-core-2.0.0.RELEASE-sources.jar!/org/springfram......

go4it ⋅ 今天 ⋅ 0

详解:Nginx反代实现Kibana登录认证功能

Kibana 5.5 版后,已不支持认证功能,也就是说,直接打开页面就能管理,想想都不安全,不过官方提供了 X-Pack 认证,但有时间限制。毕竟X-Pack是商业版。 下面我将操作如何使用Nginx反向代理...

问题终结者 ⋅ 今天 ⋅ 0

002、nginx配置虚拟主机

一、nginx配置虚拟主机可分为三种方式,分别为: 1、基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站 2、基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站...

北岩 ⋅ 今天 ⋅ 0

shell脚本之死循环写法

最近在学习写shell脚本,在练习if while等流程控制时,突然它们的死循环写法是怎么样的?经过百度与亲测记录如下: for死循环 #! /bin/bashfor ((;;));do date sleep 1d...

hensemlee ⋅ 今天 ⋅ 0

苹果的ARKit2.0有多可怕,看了就知道

序言 ARKit主要由三部分组成: 跟踪(Tracking) 跟踪是ARKit的核心组件之一,其提供了设备在物理世界中的位置与方向信息,并对物体进行跟踪,如人脸。 2.场景理解(Scene Understanding) 场...

_小迷糊 ⋅ 今天 ⋅ 0

5.1 vim介绍 5.2 vim移动光标 5.3 ,5.4vim一般模式下移动光标,复制粘贴

vim命令 vim是vi的一个升级版;vim可以显示文字的颜色 安装vim这一个包vim-enhanced 如果不知道安装包,可以使用 命令下面命令来查看vim命令是那个包安装的。 [root@linux-128 ~]# yum prov...

Linux_老吴 ⋅ 今天 ⋅ 0

vim一般模式

vim 是什么 vim是什么 ? 在之前接触Linux,编辑网卡配置文件的时候我们用过了vi ,vim简单说就是vi的升级版,它跟vi一样是Linux系统中的一个文本编辑工具。 如果系统中没有vim ,需要安装一...

李超小牛子 ⋅ 今天 ⋅ 0

docker实战

构建企业级Docker虚拟化平台实战 重点剖析虚拟化和云计算概念; 分析Docker虚拟化的概念和原理; 从0开始实战Docker虚拟化平台; 基于Docker构建Nginx WEB服务器和CentOS虚拟机; 基于开源监...

寰宇01 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部