POSIX之共享内存
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之共享内存的更多相关文章
- system v和posix的共享内存对比 & 共享内存位置
参考 http://www.startos.com/linux/tips/2011012822078.html 1)Linux和所有的UNIX操作系统都允许通过共享内存在应用程序之间共享存储空间. 2 ...
- POSIX systemV共享内存的区别
POISX共享内存分为两种方式: 1.内存映射文件 特点:共享内存的改变能在文件中体现: 2.共享内存区对象 特点:共享内存的改变在文件上看不出来(实际上根本打不开该文件): 以上两者都是基于mmap ...
- linux网络编程之posix共享内存
今天继续研究posix IPC对象,这次主要是学习一下posix共享内存的使用方法,下面开始: 下面编写程序来创建一个共享内存: 编译运行: 那posix的共享内存存放在哪里呢?上节中学的posix的 ...
- 共享内存与存储映射(mmap)
[前言]对这两个理解还是不够深刻,写一篇博客来记录一下. 首先关于共享内存的链接:共享内存.里面包含了创建共享内存区域的函数,以及两个进程怎么挂载共享内存通信,分离.释放共享内存. 共享内存的好处就是 ...
- Linux IPC实践(10) --Posix共享内存
1. 创建/获取一个共享内存 #include <sys/mman.h> #include <sys/stat.h> /* For mode constants */ #inc ...
- POSIX共享内存
DESCRIPTION 共享内存是最快的可用IPC形式.它允许多个不相关(无亲缘关系)的进程去访问同一部分逻辑内存. 如果需要在两个进程之间传输数据,共享内存将是一种效率极高的解决方案.一旦这样的内存 ...
- POSIX 共享内存和 系列函数
在前面介绍了system v 共享内存的相关知识,现在来稍微看看posix 共享内存 和系列函数. 共享内存简单来说就是一块真正的物理内存区域,可以使用一些函数将这块区域映射到进程的地址空间进行读写, ...
- 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)
注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...
- Posix共享内存区
1.概述 Posix提供了两种在无亲缘关系进程间共享内存区的方法: (1)内存映射文件:先有open函数打开,然后调用mmap函数把得到的描述符映射到当前进程地址空间中的一个文件(上一篇笔记所用到的就 ...
随机推荐
- 10分钟快速上车短视频风口:基于uniapp框架创建自己的仿抖音短视APP
在今年也就是第48次发布的<中国互联网络发展状况统计报告>有这样一个数据,21年的上半年以来,我国我国网民规模达10.11亿,其中短视频用户达8.88亿.碎片化的生活场景下,短视频成为人们 ...
- 【LeetCode】747. Largest Number At Least Twice of Others 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 寻找两次最大值 排序 大顶堆 日期 题目地址:htt ...
- 【LeetCode】540. Single Element in a Sorted Array 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 方法一:异或 方法二:判断相邻元素是否相等 方法三:二分查找 ...
- 【LeetCode】820. 单词的压缩编码 Short Encoding of Words(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode-cn.com/problems/short- ...
- GCD is Funny(hdu 5902)
GCD is Funny Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- GCD - Extreme (II)(UVA11426)
思路:欧拉函数: 欧拉函数,然后用下等差数列公式就行了. 1 #include<stdio.h> 2 #include<algorithm> 3 #include<ios ...
- 郑厂长系列故事——体检(hdu 4519)
郑厂长系列故事--体检 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total S ...
- griffin环境搭建及功能测试
目录 1 准备 mysql hive hadoop spark livy es maven 配置环境变量 2 安装griffin 配置配置文件 编译 部署jar包 3 批处理测试 准确度度量 Accu ...
- VS Code 如何设置大小写转换快捷键
一般情况下,快捷键如下: 转换为大写:Ctrl+Shift+u 转换为小写:Ctrl+Shift+l 如果不行的话,需要单独进行设置,步骤如下: 1.点击[文件]-[首选项]-[键盘快捷方式]菜单: ...
- [opencv]拟合vector<Mat>集合区域接近的元素
vector<Rect> PublicCardFrameDetection::fitrect(vector<Rect> rects){ int size = rects.siz ...