linux java 共享内存_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#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进程间通信之共享内存相关推荐
- linux 共享内存_linux进程间通信----IPC篇(一)----共享内存初识篇
先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题 一 what 所 ...
- linux open 头文件_linux下通过共享内存和mmap实现进程间通讯
前言 最近在学习GNU/Linux内核,看到mmap的时候书上说: mmap/munmap接口函数是用户最常用的两个系统调用接口,无论是在用户程序中分配内存.读写大文件.链接动态库文件,还是多进程间共 ...
- linux交换内存_Linux中的交换内存如何工作?
linux交换内存 To understand what Swap memory in Linux is, we will have a look at the concept of RAM and ...
- Linux系统编程28:进程间通信之共享内存和相关通信接口(ftok,shmget,shmctl,shmat,shmdt)
文章目录 (1)管道和共享内存的区别 (2)先组织,再描述 (3)进程间通信相关接口 A:ftok(获取唯一标识码) B:shmget(创建共享内存) C:shmctl(控制共享内存) D:shmat ...
- python进程共享内存_Python进程间通信之共享内存
前一篇博客说了怎样通过命名管道实现进程间通信,但是要在windows是使用命名管道,需要使用python调研windows api,太麻烦,于是想到是不是可以通过共享内存的方式来实现.查了一下,Pyt ...
- linux java桌面环境_Linux桌面环境玩转BT(转)
Linux桌面环境玩转BT(转)[@more@]BT全名叫"BitTorrent",中文全称:"比特流".BitTorrent是一个多点下载的开放源码的P2P软 ...
- linux java进程消失_Linux服务器Java进程消失问题解决
Linux服务器Java进程消失问题解决 发布时间:2020-08-20 15:17:37 来源:脚本之家 阅读:65 作者:myseries 这篇文章主要介绍了Linux服务器Java进程消失问题解 ...
- linux java版本查看_linux 查看java版本
inux查看java jdk安装路径和设置环境变量 windows: set java_home:查看JDK安装路径 java -version:查看JDK版本 linux: whereis java ...
- linux java进程消失_Linux系统下的Java进程无故消失怎么办?
Linux系统步骤的一些Java项目总是无故的消失,原来是Java进程被关闭掉了.为什么会出现这种情况呢?有可能是被系统自动清除多余进程,或是其他程序关掉了Java项目,这个时候该怎么办呢? 解决方法 ...
最新文章
- 《C++面向对象高效编程(第2版)》——3.11 类名、成员函数名、参数类型和文档...
- 致敬YOLO!华科提出YOLOS:基于视觉Transformer的目标检测
- 6.Verilog的always语句使用
- 残疾人无障碍设施工程改造送上门 900户家庭
- linux命令中tar后跟的zxvf是什么意思
- 沙发家具网站源码_小户型装修不会选家具?大湾网推荐你了解这些装修风格家具,装修省心空间大!...
- 分布式微服务云架构电子商务平台
- Unity3D 之武器系统冷却功能的实现方式
- HTML基础用 表格做报表
- Atitit 理解Monad attilax总结Atiti
- python 中文官方手册
- 用PS抽出滤镜让头发溶于背景nbsp;简单…
- 深入解读:从DDIM到Improved Denoising Diffusion Probabilistic Models
- android apk 应用分发平台
- 嘟嘟牛mysql 密码_嘟嘟牛管家数据转化为万象、Pubwin的操作步骤
- div onload()
- markdown如何调整行距_反Markdown试验:用Markdown的思维来使用Word
- 【愚公系列】2022年02月 Django商城项目 34-订单支付功能实现(支付宝)
- 深度linux安装宝塔,Linux 安装宝塔
- BNET通信区块链项目CEO刘建军受邀参加2018“区块链共识大会”
热门文章
- WPF 开源项目 【watcher】 守望者,一款监控,统计,分析你每天在自己电脑上究竟干了什么的软件...
- Android初学第21天
- Gulp-静态网页模块化
- mysqldump 定时备份数据(全量)
- 解决“第一次偶然出现的异常”问题
- vbs调用WebService -- 使用xmlhttp
- 图文|Android 使用Thread 和多线程使用互斥锁
- uniapp封装网络请求_八张图带你走进“通过一个完美请求封装一个网络模块”
- python 怎么拷贝一个文件到一个新的文件_Python脚本提取不同文件夹里面的文件到一个新的文件...
- oschina mysql limit_Mysql中limit的用法