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:

f5d87aa5baa5402c2cec30d85e0594e9.png

readshma:

43f2711c041b15a732d8ab40dc55f82c.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode MySQL 1193. 每月交易 I(date_format)

文章目录1. 题目2. 解题1. 题目 Table: Transactions ------------------------ | Column Name | Type | ------------------------ | id | int | | country | varchar | | state | enum | | amount | int | | trans_date …

LeetCode 1257. 最小公共区域(最小公共祖先)

文章目录1. 题目2. 解题1. 题目 给你一些区域列表 regions ,每个列表的第一个区域都包含这个列表内所有其他区域。 很自然地,如果区域 X 包含区域 Y ,那么区域 X 比区域 Y 大。 给定两个区域 region1 和 region2 ,找到同时包含…

创建样式和样式表

css中的样式(或者规则)由两部分组成:选择器和声明块。每个声明块里面可以包含多条声明,它们之间由分号分隔。如下图所示: 链接外部样式表 外部样式表可以使网页打开的速度更快。但是浏览器在下载外部样式表的时候&…

java 程序输出 赵_编写一个完整的JAVA的程序

编写一个完整的JAVA的程序关注:84 答案:1 mip版解决时间 2021-02-05 08:43提问者妳螚鬧俄螚笑2021-02-05 02:591,接口Person Show()方法输出对象的描述信息。2.类Student 实现Person接口,另有以下属性和方法:属性(私有)String name。方法Student():构造…

LeetCode 1229. 安排会议日程(双指针)

文章目录1. 题目2. 解题1. 题目 你是一名行政助理,手里有两位客户的空闲时间表:slots1 和 slots2,以及会议的预计持续时间 duration,请你为他们安排合适的会议时间。 「会议时间」是两位客户都有空参加,并且持续时间…

LeetCode 1182. 与目标颜色间的最短距离(二分查找/DP)

文章目录1. 题目2. 解题2.1 二分查找2.2 DP1. 题目 给你一个数组 colors,里面有 1、2、 3 三种颜色。 我们需要在 colors 上进行一些查询操作 queries,其中每个待查项都由两个整数 i 和 c 组成。 现在请你帮忙设计一个算法,查找从索引 i 到…

java跳转html页面_springboot 2.0.8 跳转html页面

springboot 成功创建了后,继续写一下跳转到html页面的方法, 这里我把 jsp和html 分开两篇文章。然后再写一个两种方式整合的这篇 是跳转到html文件的1创建目录结果和html文件​ 2配置return 返回模版​ 3.UserController.java代码如下,这里就直接使用上…

LeetCode MySQL 1212. 查询球队积分

文章目录1. 题目2. 解题1. 题目 Table: Teams ------------------------- | Column Name | Type | ------------------------- | team_id | int | | team_name | varchar | ------------------------- 此表的主键是 team_id,表中的每一行都…

Google Maps API 简易教程(四)

Google Maps 类型 一、基本地图类型 Google Maps API支持一下map类型: .ROADMAP(正式的,默认为2D地图) .SATELLITE(逼真的地图) .HYBRID(逼真地图道路和城市名) .TERRAIN(山脉和河流地图等等&am…

LeetCode MySQL 1077. 项目员工 III

文章目录1. 题目2. 解题1. 题目 项目表 Project: ---------------------- | Column Name | Type | ---------------------- | project_id | int | | employee_id | int | ---------------------- (project_id, employee_id) 是这个表的主键 employee_…

Java什么是重用_深度解析:java必须掌握的知识点——类的重用

类继承的概念和语法类继承的概念根据已有类来定义新类,新类拥有已有类的所有功能。Java只支持类的单继承,每个子类只能有一一个直接超类(父类)。超类是所有子类的公共属性及方法的集合,子类则是超类的特殊化。继承机制可以提高程序的抽象程度,提高代码的…

LeetCode MySQL 1205. 每月交易II(union all)*

文章目录1. 题目2. 解题1. 题目 Transactions 记录表 ------------------------- | Column Name | Type | ------------------------- | id | int | | country | varchar | | state | enum | | amount | int | | trans…

LeetCode MySQL 614. 二级关注者

文章目录1. 题目2. 解题1. 题目 在 facebook 中,表 follow 会有 2 个字段: followee, follower ,分别表示被关注者和关注者。 请写一个 sql 查询语句,对每一个关注者,查询关注他的关注者的数目。 比方说&#xff1a…

LeetCode MySQL 1454. 活跃用户(连续dense_rank排名函数)

文章目录1. 题目2. 解题1. 题目 表 Accounts: ------------------------ | Column Name | Type | ------------------------ | id | int | | name | varchar | ------------------------ id 是该表主键. 该表包含账户 id 和账户的用户名.表 Log…

java自动加空格吗_程序加上空格和不加空格运行结果不一样

已结贴√问题点数:20 回复次数:2程序加上空格和不加空格运行结果不一样程序第六行在教育教学后面加空格结果为全部图书:1.郁达夫随笔:伤感行旅 郁达夫 北京大学出版社 38.02.教育教学 李晓燕 高等教育出…

LeetCode MySQL 585. 2016年的投资(窗口函数over(partition by xx))

文章目录1. 题目2. 解题1. 题目 写一个查询语句,将 2016 年 (TIV_2016) 所有成功投资的金额加起来,保留 2 位小数。 对于一个投保人,他在 2016 年成功投资的条件是: 他在 2015 年的投保额 (TIV_2015) 至少跟一个其他投保人在 2…

LeetCode MySQL 1321. 餐馆营业额变化增长(over窗口函数)

文章目录1. 题目2. 解题1. 题目 表: Customer ------------------------ | Column Name | Type | ------------------------ | customer_id | int | | name | varchar | | visited_on | date | | amount | int | ---------------------…

LeetCode MySQL 1398. 购买了产品A和产品B却没有购买产品C的顾客

文章目录1. 题目2. 解题1. 题目 Customers 表: ------------------------------ | Column Name | Type | ------------------------------ | customer_id | int | | customer_name | varchar | ------------------------------ cust…

Java 网络编程(二) 两类传输协议:TCP UDP

两类传输协议:TCP,UDP TCP TCP是Transfer Control Protocol(传输控制协议)的简称,是一种面向连接的保证可靠传输的协议。 在TCP/IP协议中, IP层主要负责网络主机的定位,数据传输的路由,由IP地址…

LeetCode MySQL 1285. 找到连续区间的开始和结束数字(dense_rank连续排名)

文章目录1. 题目2. 解题1. 题目 表:Logs ------------------------ | Column Name | Type | ------------------------ | log_id | int | ------------------------ id 是上表的主键。 上表的每一行包含日志表中的一个 ID。后来一些 ID 从 Logs 表…