Posix 共享内存区
要点
与mmap配合使用
open与shm_open的区别,open打开磁盘上的普通文件,shm_open创建和打开的文件在/dev/shm文件夹下,该文件夹对应的是内存
gcc编译时加参数-lrt
shm_open的第一个参数名字的形式: /name, 如"/myshm"
基本函数
#include <sys/mman.h>
int shm_open(const char *name, int oflag, mode_t mode);
int shm_unlink(const char *name);
#include <unistd.h>
int ftruncate(int fd, off_t length);
#include <sys/types.h>
#include <sys/stat.h>
int fstat(int fd,struct stat *buf);
struct stat{
...
mode_t st_mode;
off_t st_size;
...
};
shm_open用于创建或打开内存文件
shm_unlink用于删除内存文件的名字,并不影响已经打开的进程
ftruncate用于调整内存文件的大小
fstat用于获取文件的属性
例子
用open和shm_open两种方式创建内存共享区;打印父子进程中两个共享区的内存地址
#include "unpipc.h"
#include <sys/stat.h>
#include <sys/mman.h>
int main(int argc, char *argv[]){
int fd1,fd2,*ptr1,*ptr2;
pid_t childpid;
struct stat st;
if(argc != 2)
err_quit("usage: ./shm <name>");
shm_unlink(argv[1]);
fd1=shm_open(argv[1],O_RDWR|O_CREAT|O_EXCL,0644);
ftruncate(fd1,sizeof(int));
fd2=Open("./shm.c",O_RDONLY,0);
fstat(fd2,&st);
if((childpid=Fork()) == 0){
ptr2=mmap(NULL,st.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd2,0);
ptr1=mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd1,0);
printf("child: shm ptr=%p, shm.c ptr=%p\n",ptr1,ptr2);
sleep(5);
printf("shared memory integer=%d\n",*ptr1);
exit(0);
}
ptr1=mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd1,0);
ptr2=mmap(NULL,st.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd2,0);
printf("father: shm ptr=%p, shm.c ptr=%p\n",ptr1,ptr2);
*ptr1=777;
waitpid(childpid,NULL,0);
exit(0);
}
Posix 共享内存区的更多相关文章
- Posix共享内存区
1.概述 Posix提供了两种在无亲缘关系进程间共享内存区的方法: (1)内存映射文件:先有open函数打开,然后调用mmap函数把得到的描述符映射到当前进程地址空间中的一个文件(上一篇笔记所用到的就 ...
- linux c编程:Posix共享内存区
Posix共享内存区:共享内存是最快的可用IPC形式.它允许多个不相关(无亲缘关系)的进程去访问同一部分逻辑内存.如果需要在两个进程之间传输数据,共享内存将是一种效率极高的解决方案.一旦这样的内存区映 ...
- Unix IPC之共享内存区(1)
1 共享内存区 共享内存区是可用IPC形式中最快的,只有映射和解除映射需要进入内核的系统调用,映射后对共享内存区的访问和修改不再需要系统调用(内核只要负责好页表映射和处理页面故障即可),但通常需要同步 ...
- System V 共享内存区
1.概述 系统调用mmap通过映射一个普通文件实现共享内存.System V 则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信.也就是说,每个共享内存区域对应特殊文件系统shm中的一个文 ...
- Linux环境编程之共享内存区(一):共享内存区简单介绍
共享内存区是可用IPC形式中最快的.一旦内存区映射到共享它的进程的地址空间,进程间数据的传递就不再涉及内核.然而往该共享内存区存放信息或从中取走信息的进程间通常须要某种形式的同步.不再涉及内核是指:进 ...
- Linux IPC实践(10) --Posix共享内存
1. 创建/获取一个共享内存 #include <sys/mman.h> #include <sys/stat.h> /* For mode constants */ #inc ...
- POSIX共享内存
DESCRIPTION 共享内存是最快的可用IPC形式.它允许多个不相关(无亲缘关系)的进程去访问同一部分逻辑内存. 如果需要在两个进程之间传输数据,共享内存将是一种效率极高的解决方案.一旦这样的内存 ...
- POSIX 共享内存和 系列函数
在前面介绍了system v 共享内存的相关知识,现在来稍微看看posix 共享内存 和系列函数. 共享内存简单来说就是一块真正的物理内存区域,可以使用一些函数将这块区域映射到进程的地址空间进行读写, ...
- 细说linux IPC(四):posix 共享内存
[版权声明:尊重原创.转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途] 上一节讲了由open函数打开一 ...
随机推荐
- 20145102 《Java程序设计》第5周学习总结
20145102 <Java程序设计>第5周学习总结 教材学习内容总结 数组在内存中会是连续的线性空间,根据索引随机取回时速度快,如果操作上有这类需求时,像是排序,就可以使用;ArrayL ...
- CentOS里下载百度网盘 / 360 网盘资源的方法
wget -c --referer=引用地址 -O 文件名 "真实下载地址" 例如,我下载资源原在的页面为http://pan.baidu.com/s/1cfJXZ ,实际下载地址 ...
- 转: javaWeb学习总结(见过最好的知识合集,相当给力,强烈推荐)
转: http://www.cnblogs.com/xdp-gacl/tag/JavaWeb%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/default.html?page ...
- WGS84坐标系下,经纬度如何换算成米
参考博客:显示瓦片地图 http://www.cnblogs.com/rhinoxy/p/4995731.html 注意:这里的计算方法精度相差比较大,不满足精确计算的需要. 需要理解的GIS概念: ...
- 【.NET基础】--委托、事件、线程(3)
之前的两篇文章我们了解了委托和事件,本文我们看一下线程. 1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程. 2,进程和线程的关系: A,进 ...
- AspxGridView 数据的汇总统计
AspxGridView底部增加数据汇总行 这个功能在AspxGridView中不用复杂的代码实现, 实际上只是设置下GridView的属性而已 1. ShowFooter设置为True,即显示. 位 ...
- MSI安装程序在Win8/Win10及以上系统中DLL安装问题
报的错误是: There is a problem with this Windows Installer package. A DLL required for this install to co ...
- x64、x86_64、x64三者的区别
x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为“IA ...
- ueditor 单独图片上传 转载
<body> <script type="text/javascript"> //这个是图片上传的,网上还有附件上传的 (function($) { var ...
- 苹果在Xcode6中弃用segue的push和model
苹果在Xcode6中弃用了segue的push和model.被show和present取代. 下面是新版本中每种类型的使用总结和例子.建议自己使用前先在测试项目中自己试一试 Show 根据当前屏幕中的 ...