文档章节

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

mickelfeng
 mickelfeng
发布于 2017/09/11 16:05
字数 694
阅读 42
收藏 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
博文 2635
码字总数 568698
作品 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环境进程间通信(五) 共享内存(下)

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

sty124578
01/29
0
0
Linux进程间通信—— 内存映射

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

li_wen01
2017/07/29
0
0
进程间通信学习小结(共享内存)

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

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

没有更多内容

加载失败,请刷新页面

加载更多

w, vmstat, top, sar, nload命令查看系统状态信息

w/uptime 查看系统负载 cat /proc/cpuinfo 查看cpu核数 vmstat 监控系统状态,用法 vmstat 1,关键的几列: r, b, swpd, si, so, bi, bo, us, wa top 查看进程使用资源情况 top -c 显示详细的...

野雪球
今天
1
0
小白创建一个spring boot项目

进入 https://start.spring.io/

lilugirl
今天
2
0
Alibaba Java诊断利器Arthas实践--使用redefine排查应用奇怪的日志来源

背景 随着应用越来越复杂,依赖越来越多,日志系统越来越混乱,有时会出现一些奇怪的日志,比如: [] [] [] No credential found 那么怎样排查这些奇怪的日志从哪里打印出来的呢?因为搞不清...

hengyunabc
今天
2
0
home hosts

home hosts lwk@qwfys:~$ cat /etc/hosts127.0.0.1 localhost127.0.1.1 qwfys192.168.56.101vm600.qwfys.com39.108.212.91alpha1.ppy.com39.108.117.122alpha2.p......

qwfys
今天
3
0
大数据教程(6.1)hadoop生态圈介绍及就业前景

1. HADOOP背景介绍 1.1、什么是HADOOP 1.HADOOP是apache旗下的一套开源软件平台 2.HADOOP提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理 3.HADOOP的核心组...

em_aaron
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部