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函数把得到的描述符映射到当前进程地址空间中的一个文件(上一篇笔记所用到的就 ...
随机推荐
- 『学了就忘』Linux日志管理 — 91、日志服务rsyslogd说明
目录 1.日志文件格式 2.rsyslogd服务的配置文件 (1)rsyslog.conf文件内容 (2)rsyslog.conf配文件内容说明 (3)定义自己的日志 1.日志文件格式 只要是由日志服 ...
- C#验证对象中的属性是否为空的共通方法
在后台接口处理时,经常需要对请求的参数做验证.因此提取了共通方法,方便进行判断. /// <summary> /// 数据验证工具类 /// </summary> public ...
- JS(JQuery) 省市区三级联动下拉选择
引入 area.js /* * 全国三级城市联动 js版 */ function Dsy(){ this.Items = {}; } Dsy.prototype.add = function(id,i ...
- JAVA根据URL生成二维码图片、根据路径生成二维码图片
引入jar包 zxing-2.3.0.jar.IKAnalyzer2012_u6.jar 下载地址:https://yvioo.lanzous.com/b00nlbp6h ...
- cmake全面教程
1. 官网教程 2. 中文教程 3. Modern CMake
- 【LeetCode】933. Number of Recent Calls 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 二分查找 队列 相似题目 参考资料 日期 题目地址: ...
- 【LeetCode】105. Construct Binary Tree from Preorder and Inorder Traversal 从前序与中序遍历序列构造二叉树(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcod ...
- BD String
BD String Accepts: 388 Submissions: 1164 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/ ...
- Redis 实现了自己的 VM
Redis的VM(虚拟内存)机制就是暂时把不经常访问的数据(冷数据)从内存交换到磁盘中,从而腾出宝贵的内存空间用于其它需要访问的数据(热数据). Redis提高数据库容量的办法有两种: 1.一种是可以 ...
- TriggerBN ++
目录 motivation settings results motivation 用两个BN(一个用于干净样本, 一个用于对抗样本), 结果当使用\(\mathrm{BN}_{nat}\)的时候, ...