基本参考 《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之共享内存的使用方法的更多相关文章

  1. 浅析Linux下进程间通信:共享内存

    浅析Linux下进程间通信:共享内存 共享内存允许两个或多个进程共享一给定的存储区.因为数据不需要在客户进程和服务器进程之间复制,所以它是最快的一种IPC.使用共享内存要注意的是,多个进程之间对一给定 ...

  2. 在Linux下访问Windows共享目录的配置方法

    在Linux下访问Windows共享目录的配置方法 1.在Windows上设置一个共享目录 如:将d:\RedHat_disk设置为共享目录 2.在Windows上创建一个用户,如tommy,密码11 ...

  3. Linux下进程间通信方式——共享内存

    1.什么是共享内存? 共享内存就是允许两个或多个进程共享一定的存储区.就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针.当一个进程改变了这块地址中的内容的时候,其它进程都会察 ...

  4. 20155239吕宇轩 Linux下IPC机制

    20155239吕宇轩 Linux下IPC机制 - 共享内存 原理:把所有需要使用的共享数据都存放在共享内存 区域中,任何想要访问这些共享数据的进程都必须在自己的进程地址空间中新增加一块内存区域,用来 ...

  5. Linux IPC之共享内存C 事例

    Linux IPC之共享内存 标签: linuxrandomnull工作 2011-08-25 11:52 4123人阅读 评论(0) 收藏 举报  分类: Linux(3)  读书札记(3)  版权 ...

  6. 20155202 张旭 课下作业: Linux下IPC机制

    20155202张旭 Linux下IPC机制 IPC机制定义 在linux下的多个进程间的通信机制叫做IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方 ...

  7. Linux下IPC机制

    Linux下IPC机制 实践要求 研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接 共享内存 管道 FIFO 信号 消息队列 IPC 进程间通信(IPC,Inter ...

  8. IPC进程间通信---共享内存

    共享内存 共享内存:共享内存就是分配一块能被其它进程访问的内存.每个共享内存段在内核中维护着一个内部结构shmid_ds, 该结构定义在头文件linux/shm.h中,其结构如下: struct sh ...

  9. Linux进程间通信(System V) --- 共享内存

    共享内存 IPC 原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,下图所示为进程间使用共享内存实现大量数据传输的示意图: 共享内存是在内存中单独开辟的一段内存空间,这段内存空间有自己特有 ...

随机推荐

  1. CVE-2021-35042

    CVE-2021-35042 漏洞介绍 Django 是 Python 语言驱动的一个开源模型-视图-控制器(MVC)风格的 Web 应用程序框架. 漏洞影响版本:django 3.1.3.2 202 ...

  2. C#中的接口和类有什么异同

    不同点: 1. 不能直接实例化接口 2. 接口中的成员不能用访问修饰符修饰(默认public) 3. 接口不包含方法的实现 4. 接口可以多继承,类只能单继承. 5. 类定义可在不同的源文件之间进行拆 ...

  3. Java学习笔记-基础语法Ⅱ

    成员变量:类中方法外的变量 局部变量:方法中的变量 注意,成员变量有默认初始值,而局部变量需要赋初始值 Java中虽然没有明确规定类必须首字母大写,但为了规范最好大写(因为自己刚刚写的时候就没看清写错 ...

  4. 伪元素选择器,选择器优先级,CSS修改文字属性,CSS修改字体属性,CSS修改其他属性

    伪元素选择器 未使用元素选择器的效果 第一行:伪元素选择器:选择部分内容 第二行:伪元素选择器:选择部分内容 伪元素选择器:选择部分内容 伪元素选择器:选择部分内容 ::selection:选择指定元 ...

  5. idea maven 依赖还原不上的问题 method <init>()V not found

    问题 还原项目依赖的时候报错: java.lang.RuntimeException: org.codehaus.plexus.component.repository.exception.Compo ...

  6. 【mq】从零开始实现 mq-11-消费者消息回执添加分组信息 pull message ack groupName

    前景回顾 [mq]从零开始实现 mq-01-生产者.消费者启动 [mq]从零开始实现 mq-02-如何实现生产者调用消费者? [mq]从零开始实现 mq-03-引入 broker 中间人 [mq]从零 ...

  7. 299. Bulls and Cows - LeetCode

    Question 299. Bulls and Cows Solution 题目大意:有一串隐藏的号码,另一个人会猜一串号码(数目相同),如果号码数字与位置都对了,给一个bull,数字对但位置不对给一 ...

  8. 好客租房24-react中的事件处理(事件绑定)

    3.1事件绑定 React事件绑定语法和DOM事件语法相似 语法:on+事件名称={事件处理程序} 比如οnclick={()=>{}} //导入react     import React f ...

  9. 前端js堆栈

    1.介绍创建数据的时候就会占用内容.内存主要开辟了两类空间1. 堆(进程,线程共享) 大小不固定,可随时增加不允许js直接访问堆内存存储引用类型数据按引用访问存储的值大小不定,可动态调整主要用来存放对 ...

  10. [C++STL] vector 容器的入门

    vector容器的入门 #include<vector> 创建vector容器的几种方式 数据类型可以是结构体,也能是另外一个容器 vector 的初始化: (1) 创建并声明大小 vec ...