shm_write.c:

#include<stdio.h>
#include<stdlib.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/mman.h>
#include <sys/wait.h>
void p_error(const char* str)
{
perror(str);
exit(1);
}
int main(int argc,char* argv[])
{
int ret;
size_t mem_size = sysconf(_SC_PAGE_SIZE);
int fd=shm_open("/mymen", O_CREAT|O_TRUNC|O_RDWR,0666);
if(fd==-1)
{
perror("创建共享内存失败\n");
}
printf("创建共享内存成功\n"); //第二个参数用来指定截取共享内存空间大小
ftruncate(fd,mem_size); void* ptr=mmap(0,mem_size,PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); /*
//第一个参数为0表示系统会自动寻找空闲空间作为开始地址
//void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);
flags: 指定映射对象的类型,映射选项和映射页是否可以共享。
它的值可以是一个或者多个以下位的组合 体 MAP_SHARED 与其它所有映射这个对象的进程共享映射空间。
对共享区的写入,相当于输出到文 件。 直到msync()或者munmap()被调用,文件实际上不会被更新。
MAP_PRIVATE 建立一个写入时拷贝的私有映射。内存区域的写入不会影响到原文件。
这个标志和以 上标志是互斥的,只能使用其中一个。 MAP_LOCKED 锁定映射区的页面,从而防止页面被交换出内存。
*/ //成功返回共享内存地址,失败返回MAP_FAILED
if (ptr == MAP_FAILED)
{
p_error("内存映射失败\n");
} close(fd); int i=0; while(i<10)
{
sprintf((char*)ptr,"data%d",i++);
printf("写入的数据为:%s\n",(char*)ptr);
sleep(1); } ret = munmap(ptr, mem_size); //卸载共享内存
if (ret != 0)
{
p_error("卸载内存失败");
}
// ret = shm_unlink("/mymen");
// if (ret != 0)
// {
// p_error("删除共享内存");
// } return 0;
}

shm_read.c:

#include<stdio.h>
#include<stdlib.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/mman.h>
#include <sys/wait.h>
void p_error(const char* str)
{
perror(str);
exit(1);
}
int main(int argc,char* argv[])
{
int ret;
size_t mem_size = sysconf(_SC_PAGE_SIZE);
int fd=shm_open("/mymen",O_RDONLY,0666);
if(fd==-1)
{
perror("创建共享内存失败\n");
}
printf("创建共享内存成功\n"); ftruncate(fd,mem_size); void* ptr=mmap(0,mem_size,PROT_READ, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED)
{
p_error("内存映射失败\n");
} close(fd); while(ptr++)
{
printf("读出的数据为:%s\n",(char*)ptr);
sleep(1);
} ret = munmap(ptr, mem_size); //卸载共享内存
if (ret != 0)
{
p_error("卸载内存失败");
}
ret = shm_unlink("/mymen");
if (ret != 0)
{
p_error("删除共享内存");
} return 0;
}

POSIX之共享内存的更多相关文章

  1. system v和posix的共享内存对比 & 共享内存位置

    参考 http://www.startos.com/linux/tips/2011012822078.html 1)Linux和所有的UNIX操作系统都允许通过共享内存在应用程序之间共享存储空间. 2 ...

  2. POSIX systemV共享内存的区别

    POISX共享内存分为两种方式: 1.内存映射文件 特点:共享内存的改变能在文件中体现: 2.共享内存区对象 特点:共享内存的改变在文件上看不出来(实际上根本打不开该文件): 以上两者都是基于mmap ...

  3. linux网络编程之posix共享内存

    今天继续研究posix IPC对象,这次主要是学习一下posix共享内存的使用方法,下面开始: 下面编写程序来创建一个共享内存: 编译运行: 那posix的共享内存存放在哪里呢?上节中学的posix的 ...

  4. 共享内存与存储映射(mmap)

    [前言]对这两个理解还是不够深刻,写一篇博客来记录一下. 首先关于共享内存的链接:共享内存.里面包含了创建共享内存区域的函数,以及两个进程怎么挂载共享内存通信,分离.释放共享内存. 共享内存的好处就是 ...

  5. Linux IPC实践(10) --Posix共享内存

    1. 创建/获取一个共享内存 #include <sys/mman.h> #include <sys/stat.h> /* For mode constants */ #inc ...

  6. POSIX共享内存

    DESCRIPTION 共享内存是最快的可用IPC形式.它允许多个不相关(无亲缘关系)的进程去访问同一部分逻辑内存. 如果需要在两个进程之间传输数据,共享内存将是一种效率极高的解决方案.一旦这样的内存 ...

  7. POSIX 共享内存和 系列函数

    在前面介绍了system v 共享内存的相关知识,现在来稍微看看posix 共享内存 和系列函数. 共享内存简单来说就是一块真正的物理内存区域,可以使用一些函数将这块区域映射到进程的地址空间进行读写, ...

  8. 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)

    注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...

  9. Posix共享内存区

    1.概述 Posix提供了两种在无亲缘关系进程间共享内存区的方法: (1)内存映射文件:先有open函数打开,然后调用mmap函数把得到的描述符映射到当前进程地址空间中的一个文件(上一篇笔记所用到的就 ...

随机推荐

  1. 【C语言】Socket发送HTTP-TCP请求,数据有字符串插入

    问题描述: 场景:编写Socket接口,向LOKI发送POST请求查询数据 BUG发现位置:通过cJSON读取时间戳,发现被截断. 现象:通过read()去读取返回的数据,数据行中被插入字符:如下 c ...

  2. vue+uniapp实现美颜拍照录像,相册选择 | 录像限制时长,美颜拍照录像

    一.插件简介 Zhimi-BeautyCamera(智密 - 美颜相机图册插件)是一个支持美颜录像,美颜拍照,选择图视频功能,带录像参数时长限制的uniapp原生插件.平台支持:Android.IOS ...

  3. 关于c++、go、nodejs、python的计算性能测试,结果令人惊讶

    计算性能在计算密集型的服务上,是非常重要的, 一直以为,在计算性能上,肯定是C++  > go > nodejs >= python 但测试结果却让人大跌眼镜!!! 实际的结果是: ...

  4. JAVA判断IP是否是内网IP

    /** * 私有IP: * A类  10.0.0.0-10.255.255.255   * B类  172.16.0.0-172.31.255.255   * C类  192.168.0.0-192. ...

  5. 【LeetCode】145. Binary Tree Postorder Traversal 解题报告 (C++&Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 迭代 日期 题目地址:https://leetc ...

  6. 【LeetCode】734. Sentence Similarity 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 只修改区间起终点 日期 题目地址:https://le ...

  7. 【LeetCode】921. Minimum Add to Make Parentheses Valid 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址: https://leetcode. ...

  8. 【LeetCode】680. Valid Palindrome II 验证回文字符串 Ⅱ(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双指针 思路来源 初版方案 进阶方案 日期 题目地址 ...

  9. The Monkey King(hdu5201)

    The Monkey King Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  10. 3942 - Remember the Word

    3942 - Remember the Word 思路:字典树+dp dp[i]前i个字符,能由给的字串组成的方案数,那么dp[i] = sum(dp[i-k]);那么只要只要在字典树中查看是否有字串 ...