一,共享内存

内核管理一片物理内存,允许不同的进程同时映射,多个进程可以映射同一块内存,被多个进程同时映射的物理内存,即共享内存。

映射物理内存叫挂接,用完以后解除映射叫脱接。

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#include#include#include#include#include

intmain()

{//生成一个key

key_t key = ftok("./", 66);//创建共享内存,返回一个id

int shmid = shmget(key, 8, IPC_CREAT|0666|IPC_EXCL);if(-1 ==shmid)

{

perror("shmget failed");

exit(1);

}//映射共享内存,得到虚拟地址

void *p = shmat(shmid, 0, 0);if((void*)-1 ==p)

{

perror("shmat failed");

exit(2);

}//写共享内存

int *pp =p;*pp = 0x12345678;*(pp + 1) = 0xffffffff;//解除映射

if(-1 ==shmdt(p))

{

perror("shmdt failed");

exit(3);

}

printf("解除映射成功,点击回车销毁共享内存\n");

getchar();//销毁共享内存

if(-1 ==shmctl(shmid, IPC_RMID, NULL))

{

perror("shmctl failed");

exit(4);

}return 0;

}

进程B:

//readshm.c

#include#include#include#include#include#include

intmain()

{//生成一个key

key_t key = ftok("./", 66);//获取共享内存,返回一个id

int shmid = shmget(key, 0, 0);if(-1 ==shmid)

{

perror("shmget failed");

exit(1);

}//映射共享内存,得到虚拟地址

void *p = shmat(shmid, 0, 0);if((void*)-1 ==p)

{

perror("shmat failed");

exit(2);

}//读共享内存

int x = *(int *)p;int y = *((int *)p + 1);

printf("从共享内存中都取了:0x%x 和 0x%x \n", x, y);//解除映射

if(-1 ==shmdt(p))

{

perror("shmdt failed");

exit(3);

}return 0;

}

运行结果:

writeshma:

readshma:

linux java 共享内存_Linux进程间通信之共享内存相关推荐

  1. linux 共享内存_linux进程间通信----IPC篇(一)----共享内存初识篇

    先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题 一 what 所 ...

  2. linux open 头文件_linux下通过共享内存和mmap实现进程间通讯

    前言 最近在学习GNU/Linux内核,看到mmap的时候书上说: mmap/munmap接口函数是用户最常用的两个系统调用接口,无论是在用户程序中分配内存.读写大文件.链接动态库文件,还是多进程间共 ...

  3. linux交换内存_Linux中的交换内存如何工作?

    linux交换内存 To understand what Swap memory in Linux is, we will have a look at the concept of RAM and ...

  4. Linux系统编程28:进程间通信之共享内存和相关通信接口(ftok,shmget,shmctl,shmat,shmdt)

    文章目录 (1)管道和共享内存的区别 (2)先组织,再描述 (3)进程间通信相关接口 A:ftok(获取唯一标识码) B:shmget(创建共享内存) C:shmctl(控制共享内存) D:shmat ...

  5. python进程共享内存_Python进程间通信之共享内存

    前一篇博客说了怎样通过命名管道实现进程间通信,但是要在windows是使用命名管道,需要使用python调研windows api,太麻烦,于是想到是不是可以通过共享内存的方式来实现.查了一下,Pyt ...

  6. linux java桌面环境_Linux桌面环境玩转BT(转)

    Linux桌面环境玩转BT(转)[@more@]BT全名叫"BitTorrent",中文全称:"比特流".BitTorrent是一个多点下载的开放源码的P2P软 ...

  7. linux java进程消失_Linux服务器Java进程消失问题解决

    Linux服务器Java进程消失问题解决 发布时间:2020-08-20 15:17:37 来源:脚本之家 阅读:65 作者:myseries 这篇文章主要介绍了Linux服务器Java进程消失问题解 ...

  8. linux java版本查看_linux 查看java版本

    inux查看java jdk安装路径和设置环境变量 windows: set java_home:查看JDK安装路径 java -version:查看JDK版本 linux: whereis java ...

  9. linux java进程消失_Linux系统下的Java进程无故消失怎么办?

    Linux系统步骤的一些Java项目总是无故的消失,原来是Java进程被关闭掉了.为什么会出现这种情况呢?有可能是被系统自动清除多余进程,或是其他程序关掉了Java项目,这个时候该怎么办呢? 解决方法 ...

最新文章

  1. 《C++面向对象高效编程(第2版)》——3.11 类名、成员函数名、参数类型和文档...
  2. 致敬YOLO!华科提出YOLOS:基于视觉Transformer的目标检测
  3. 6.Verilog的always语句使用
  4. 残疾人无障碍设施工程改造送上门 900户家庭
  5. linux命令中tar后跟的zxvf是什么意思
  6. 沙发家具网站源码_小户型装修不会选家具?大湾网推荐你了解这些装修风格家具,装修省心空间大!...
  7. 分布式微服务云架构电子商务平台
  8. Unity3D 之武器系统冷却功能的实现方式
  9. HTML基础用 表格做报表
  10. Atitit 理解Monad attilax总结Atiti
  11. python 中文官方手册
  12. 用PS抽出滤镜让头发溶于背景nbsp;简单…
  13. 深入解读:从DDIM到Improved Denoising Diffusion Probabilistic Models
  14. android apk 应用分发平台
  15. 嘟嘟牛mysql 密码_嘟嘟牛管家数据转化为万象、Pubwin的操作步骤
  16. div onload()
  17. markdown如何调整行距_反Markdown试验:用Markdown的思维来使用Word
  18. 【愚公系列】2022年02月 Django商城项目 34-订单支付功能实现(支付宝)
  19. 深度linux安装宝塔,Linux 安装宝塔
  20. BNET通信区块链项目CEO刘建军受邀参加2018“区块链共识大会”

热门文章

  1. WPF 开源项目 【watcher】 守望者,一款监控,统计,分析你每天在自己电脑上究竟干了什么的软件...
  2. Android初学第21天
  3. Gulp-静态网页模块化
  4. mysqldump 定时备份数据(全量)
  5. 解决“第一次偶然出现的异常”问题
  6. vbs调用WebService -- 使用xmlhttp
  7. 图文|Android 使用Thread 和多线程使用互斥锁
  8. uniapp封装网络请求_八张图带你走进“通过一个完美请求封装一个网络模块”
  9. python 怎么拷贝一个文件到一个新的文件_Python脚本提取不同文件夹里面的文件到一个新的文件...
  10. oschina mysql limit_Mysql中limit的用法