Linux下IPC之共享内存的使用方法
基本参考 《Unix环境高级编程》第14.9节共享内存来学习。
参考blog:https://blog.csdn.net/weixin_45794138/article/details/121256996
需要说明的
讲shmget(key,size, flag)函数时,书上大概意识是说,
想访问已有的shm时,key不应与IPC_CREATE 同时指定。
实际上测试,可以二者同时指定:
已有此key的shm且size满足要求(已有shm的size ≥ 函数中指定的size)时,直接返回已有的shmid。
若size不满足,则失败返回-1若未有此key的shm,则使用 key 和 size 创建新的IPC结构,并返回shmid;创建失败则返回-1.
getshm()函数,常见的调用示例:
点击查看代码
int shmid = shmget(key, SHM_SIZE, IPC_CREAT|IPC_EXCL|0666); //强制创建新的,且指定访问权bits位
int shmid = shmget(key, SHM_SIZE, 0); //强制使用已有的,且满足 size >= SHM_SIZE, 否则失败返回-1
int shmid = shmget(key, SHM_SIZE, IPC_CREAT); //若无此key的shm,则创建新的shmid并返回,创建失败返回-1;
//若已有此key的shm且size满足要求,直接返回已有的shmid;
//已有此key的shm但size不满足要求,同样失败返回-1.
Server端示例代码
废话不多说, 赶紧上代码,首先是server端,开辟共享内存shm并写入内容进去:
点击查看代码
#include <stdio.h>
//#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_PATH "/var/run/pnkey"
#define SHM_SIZE 128
int main(){
key_t key = ftok(SHM_PATH, 0x6666); //file to key,传入的文件SHM_PATH必须存在(权限不要求),否则失败返回-1
if(key<0){
printf("shm key return -1. Please contact the device vendor.");
}
// //强制创建1块新的共享内存shm,并设置访问权限位.
// int shmid = shmget(key, SHM_SIZE, IPC_CREAT|IPC_EXCL|0666);
// if(shmid <0 ){
// printf("Failed to get/create share memory with key= 0x%8x.\n", (int)key );
// //先尝试获取已有的shm
// shmid = shmget(key, 0, 0);
// if(shmid <0 ){
// printf("Failed to retrive share momory with key= 0x%4x.\n", (int)key);
// return -1;
// }
// //查看获取的shm的size
// struct shmid_ds * buf;
// int rst = shmctl(shmid, IPC_STAT, buf);
// if(buf->shm_segsz != SHM_SIZE){
// printf("The retrived SHM has different size.\n");
// return -1;
// }
// }
//获取此key已有的共享内存shm,未找到时创建新的.[可替代上面的手动检索!]
int shmid = shmget(key, SHM_SIZE, IPC_CREAT);
//attach到进程空间
char * addr = shmat(shmid, NULL , 0);
if(addr <= 0 ){
printf("failed to attach share memory.\n");
return -1;
}
//使用shm,写入
sprintf(addr, "%s", "共享内存,您好~\n");
return 0;
}
Client端示例代码
接着是client端的,查找出已有的共享内存shm,并从中读取
点击查看代码
#include <stdio.h>
#include <string.h>
//#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_PATH "/var/run/pnkey"
#define SHM_SIZE 128
int main(){
key_t key = ftok(SHM_PATH, 0x6666);
if(key<0){
printf("shm key return -1. Please contact the device vendor.");
}
char buf[128];
//int shmid = shmget(key, SHM_SIZE, IPC_CREAT);
int shmid = shmget(key, SHM_SIZE, 0);
if(shmid <0){
printf("Failed to retrive share memory.\n");
return -1;
}
char * addr = shmat(shmid, NULL, SHM_RDONLY); //只读挂载
if(addr<=0){
printf("Failed to map share memory.\n");
return -1;
}
//使用shm,打印字符串.
strcpy(buf, addr);
printf("%s", buf);
printf("%s", addr); //可以直接打印,不必strcpy; 但得考虑同步问题,防止读写并发冲突。
return 0;
}
Linux下IPC之共享内存的使用方法的更多相关文章
- 浅析Linux下进程间通信:共享内存
浅析Linux下进程间通信:共享内存 共享内存允许两个或多个进程共享一给定的存储区.因为数据不需要在客户进程和服务器进程之间复制,所以它是最快的一种IPC.使用共享内存要注意的是,多个进程之间对一给定 ...
- 在Linux下访问Windows共享目录的配置方法
在Linux下访问Windows共享目录的配置方法 1.在Windows上设置一个共享目录 如:将d:\RedHat_disk设置为共享目录 2.在Windows上创建一个用户,如tommy,密码11 ...
- Linux下进程间通信方式——共享内存
1.什么是共享内存? 共享内存就是允许两个或多个进程共享一定的存储区.就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针.当一个进程改变了这块地址中的内容的时候,其它进程都会察 ...
- 20155239吕宇轩 Linux下IPC机制
20155239吕宇轩 Linux下IPC机制 - 共享内存 原理:把所有需要使用的共享数据都存放在共享内存 区域中,任何想要访问这些共享数据的进程都必须在自己的进程地址空间中新增加一块内存区域,用来 ...
- Linux IPC之共享内存C 事例
Linux IPC之共享内存 标签: linuxrandomnull工作 2011-08-25 11:52 4123人阅读 评论(0) 收藏 举报 分类: Linux(3) 读书札记(3) 版权 ...
- 20155202 张旭 课下作业: Linux下IPC机制
20155202张旭 Linux下IPC机制 IPC机制定义 在linux下的多个进程间的通信机制叫做IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方 ...
- Linux下IPC机制
Linux下IPC机制 实践要求 研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接 共享内存 管道 FIFO 信号 消息队列 IPC 进程间通信(IPC,Inter ...
- IPC进程间通信---共享内存
共享内存 共享内存:共享内存就是分配一块能被其它进程访问的内存.每个共享内存段在内核中维护着一个内部结构shmid_ds, 该结构定义在头文件linux/shm.h中,其结构如下: struct sh ...
- Linux进程间通信(System V) --- 共享内存
共享内存 IPC 原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,下图所示为进程间使用共享内存实现大量数据传输的示意图: 共享内存是在内存中单独开辟的一段内存空间,这段内存空间有自己特有 ...
随机推荐
- 交换机POE技术知识大全
公众号关注 「开源Linux」 回复「学习」,有我为您特别筛选的学习资料~ 一个典型的以太网供电系统,在配线柜里保留以太网交换机设备,用一个带电源供电集线器(Midspan HUB)给局域网的双绞线提 ...
- nova服务的基本使用
创建flavor类型 [root@controller ~]# openstack help flavor create usage: openstack flavor create [-h] [-f ...
- FinOps for Kubernetes - 如何拆分 Kubernetes 成本
本文独立博客阅读地址:https://thiscute.world/posts/finops-for-kubernetes/ 目录 云计算成本管控 Kubernetes 成本分析的难点 Kuberne ...
- Yapi Docker 部署
参考 https://github.com/Ryan-Miao/docker-yapi , 并使用该代码的脚本构建yapi image. 部署mongodb docker run \ --name m ...
- Linux下切换root用户提示Authentication failure错误的解决方法(亲测有效)
第一种情况可能是root密码输入错误造成的,再仔细检查一遍是否输入错误 第二种是刚安装完,没有设置root用户密码导致的,我的就是最小化安装,就会出现这种小问题 解决办法:sudo passwd 然后 ...
- drools的类型声明(Type declarations)
一.背景 在我们编写drl规则的时候,有些时候需要自己声明一些类,用于辅助之后的规则运行,如果需要用到的类还需要在java中预先声明出来,这样就不灵活了,那么是否可以在drl文件中声明一个类呢?可以使 ...
- 论文解读(GMIM)《Deep Graph Clustering via Mutual Information Maximization and Mixture Model》
论文信息 论文标题:Deep Graph Clustering via Mutual Information Maximization and Mixture Model论文作者:Maedeh Ahm ...
- 第06组 Alpha冲刺 (2/6)
目录 1.1 基本情况 1.2 冲刺概况汇报 1.郝雷明 2. 方梓涵 3. 黄少丹 4. 董翔云 5.曾丽莉 6. 詹鑫冰 7.鲍凌函 8.杜筱 9.曹兰英 10. 吴沅静 1.3 冲刺成果展示 1 ...
- String 为什么不可变?
转载来源:String为什么不可变 今天来分享一道群友去阿里云面试遇到的 Java 基础面试真题:"String.StringBuffer.StringBuilder 的区别?String ...
- Vmware虚拟机安装及相关配置流程
1.Vmware虚拟软件安装 1.1下载地址 vmware 12 pro 的版本稳定性较好,所有我们最好选择该版本 下载地址:https://www.onlinedown.net/soft/10053 ...