Linux进程间通信之共享内存
一,共享内存
内核管理一片物理内存,允许不同的进程同时映射,多个进程可以映射同一块内存,被多个进程同时映射的物理内存,即共享内存。
映射物理内存叫挂接,用完以后解除映射叫脱接。
1,共享内存的特点:
优点:是最快的IPC。
缺点:要编程者自己实现对共享内存互斥访问。如何实现?
2,编程模型:具体函数的用法可以用man手册查看(强力推荐)
进程A: writeshm.c
1) 获得key, ftok()
2) 使用key来创建一个共享内存 shmget()
3) 映射共享内存(得到虚拟地址), shmat()
4) 使用共享内存, 往共享内存中写入数据
5) 解除映射 shmdt()
6) 如果共享内存不再使用,可以使用shmctl()销毁共享内存
进程B: readshm.c
1) 获得key, ftok()
2) 使用key来获得一个共享内存 shmget()
3) 映射共享内存(得到虚拟地址), shmat()
4) 使用共享内存, 读取共享内存中的数据
5) 解除映射 shmdt()
3,实例
进程A:
// writeshm.c #include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h> int main()
{
// 生成一个key
key_t key = ftok("./", ); // 创建共享内存,返回一个id
int shmid = shmget(key, , IPC_CREAT||IPC_EXCL);
if(- == shmid)
{
perror("shmget failed");
exit();
} // 映射共享内存,得到虚拟地址
void *p = shmat(shmid, , );
if((void*)- == p)
{
perror("shmat failed");
exit();
} // 写共享内存
int *pp = p;
*pp = 0x12345678;
*(pp + ) = 0xffffffff; // 解除映射
if(- == shmdt(p))
{
perror("shmdt failed");
exit();
}
printf("解除映射成功,点击回车销毁共享内存\n");
getchar(); // 销毁共享内存
if(- == shmctl(shmid, IPC_RMID, NULL))
{
perror("shmctl failed");
exit();
} return ;
}
进程B:
// readshm.c #include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h> int main()
{
// 生成一个key
key_t key = ftok("./", ); // 获取共享内存,返回一个id
int shmid = shmget(key, , );
if(- == shmid)
{
perror("shmget failed");
exit();
} // 映射共享内存,得到虚拟地址
void *p = shmat(shmid, , );
if((void*)- == p)
{
perror("shmat failed");
exit();
} // 读共享内存
int x = *(int *)p;
int y = *((int *)p + );
printf("从共享内存中都取了:0x%x 和 0x%x \n", x, y); // 解除映射
if(- == shmdt(p))
{
perror("shmdt failed");
exit();
} return ;
}
运行结果:
writeshma:

readshma:

Linux进程间通信之共享内存的更多相关文章
- Linux进程间通信—使用共享内存
Linux进程间通信-使用共享内存 转自: https://blog.csdn.net/ljianhui/article/details/10253345 下面将讲解进程间通信的另一种方式,使用共享内 ...
- Linux进程间通信——使用共享内存
一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式.不同进程之间共享的内存通常安排为同一段物理内存. ...
- linux进程间通信之共享内存篇
本文是对http://www.cnblogs.com/andtt/articles/2136279.html中共享内存(上)的进一步阐释说说明 1 共享内存的实现原理 共享内存是linux进程间通讯的 ...
- Linux进程间通信——使用共享内存(转)
一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式.不同进程之间共享的内存通常安排为同一段物理内存. ...
- Linux进程间通信(四) - 共享内存
共享内存的优势 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只 ...
- linux进程间通信之共享内存学习记录
进程 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed). 广义定义:进程是一个具有一定独立功能的 ...
- linux进程间通信同步-共享内存
参考:https://www.cnblogs.com/charlesblc/p/6142868.html 使用有名信号量,sem_open().sem_close().sem_post().sem_w ...
- 浅析Linux下进程间通信:共享内存
浅析Linux下进程间通信:共享内存 共享内存允许两个或多个进程共享一给定的存储区.因为数据不需要在客户进程和服务器进程之间复制,所以它是最快的一种IPC.使用共享内存要注意的是,多个进程之间对一给定 ...
- Linux环境进程间通信(五): 共享内存(下)
linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...
随机推荐
- 烂泥:openvpn双网卡客户端与内网机器通信
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb. 前段时间写了一篇有关openvpn搭建与内网机器通信的文章,那篇文章是基于服务器单网卡 ...
- linux关于文件的那些事儿
一个文件的权限对于系统的安全来说是很重要的,linux是一个支持多任务多用户的系统,我们都不希望一些自己的文件被别人看到或者修改! 对于一个文件的权限我们可以用 ls -l 命令来查看,例如: [ro ...
- input子系统
input子系统: 像按键.键盘.鼠标.触摸屏.游戏摇杆等设备只有输入没有输出,而且在编程实现其对应的驱动程序时会有很多重复性的代码,内核的设计者将该部分代码抽象出来,驱动工程师只需要复用该 ...
- java对redis的基本操作
一.server端安装 1.下载 https://github.com/MSOpenTech/redis 可看到当前可下载版本:redis2.6
- 在ASP.NET MVC中使用Unity进行依赖注入的三种方式
在ASP.NET MVC4中,为了在解开Controller和Model的耦合,我们通常需要在Controller激活系统中引入IoC,用于处理用户请求的 Controller,让Controller ...
- hadoop日常运维与升级总结
日常运维 升级 问题处理方法 日常运维 进程管理 由于配置文件的更改,需要重启生效, 或者是进程自己因某种致命原因终止, 或者发现进程工作出现异常等情况下,需要进行手动进程的关闭或启动, 或者是增删节 ...
- C#笔记---动态类(Dynamic)应用
背景: 在Coding中有时候会遇到一些需要解析的数据,可是数据的字段数量和名称未统一,我们没法定义实体类来对应.那么我们就会想到通过C#的dynamic动态类来实现,如果大家注意的话一些ORM框架里 ...
- [麦先生]TP3.2之微信开发那点事[基础篇](网页授权开发之小Demo)
用户à 点击按钮进入授权页面并确认授权à 服务器返回code给开发者à 利用code,APPID,APPsecret组合数据请求API获取access_token和openidà 利用access_t ...
- 彻底解决mysql中文乱码的办法,修改mysql解压缩版(免安装版或zip版)字符编码
MySQL会出现中文乱码的原因不外乎下列几点:1.server本身设定问题,例如server字符编码还停留在latin12.table的语系设定问题(包含character与collation)3.客 ...
- 【CImg】霍夫变换——直线检测
霍夫变换——直线检测 考古debug,其实很久之前就解决的bug......一直忘记过来改文章....欸 =============================原文================ ...