基本参考 《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. 一文带你读懂zookeeper在大数据生态的应用

    一个执着于技术的公众号 一.简述 在一群动物掌管的世界中,动物没有人类聪明的思想,为了保持动物世界的生态平衡,这时,动物管理员-zookeeper诞生了. 打开Apache zookeeper的官网, ...

  2. 真香!Windows 可直接运行 Linux 了

    点击关注上方"开源Linux", 后台回复"读书",有我为您特别筛选书籍资料~ 之前了解过一些适用于Linux的Windows子系统,最近又听人提起,于是在自己 ...

  3. 详解六大国产CPU处理器

    一个执着于技术的公众号 CPU作为计算机设备的运算和控制核心,负责指令读取.译码与执行,因研发门槛高.生态构建难,被认为是集成电路产业中的"珠穆朗玛峰". 纵观全球,Intel.A ...

  4. ajax 请求登录超时跳转登录页解决方法

    在Filter里判断是否登录,如果未登录返回401状态 public class SelfOnlyAttribute : ActionFilterAttribute { public override ...

  5. centos7安装zabbix5.0

    一.安装zabbix-server 操作系统:CentOS 7.5 1.首先关闭防火墙与SElinux 关闭防火墙 systemctl stop firewalld&&systemct ...

  6. 一键解决Win10 LTSC 2021官方镜像存在的问题

    一键解决Win10 LTSC 2021官方镜像存在的问题 由于适用了win10 ltsc 2021之后,发现官方镜像存在一些致命的bug.但是本人又喜欢这个官方精简的系统,所以进行了一些修复.并将搜集 ...

  7. 使用 VS Code + Markdown 编写 PDF 文档

    背景介绍 作为一个技术人员,基本都需要编写技术相关文档,而且大部分技术人员都应该掌握 markdown 这个技能,使用 markdown 来编写并生成 PDF 文档将会是一个不错的体验,以下就介绍下如 ...

  8. 汇编语言中loop循环编程

    (1)向内存0:200~ 0:23f依次传送数据0~63(3FH) (2)同上简化后的代码,要求九行以内

  9. [THUSCH2017] 杜老师

    description \(T\)次询问,每次问\(L,L+1...R\)有多少种子集满足子集中乘积为完全平方数. solution 50pt 首先双倍经验 通常的思路是:平方数即每个质因子指数为偶 ...

  10. 【Java面试】请说一下Mysql索引的优点和缺点?

    今天分享的这道面试题,让一个工作4年的小伙子去大众点评拿了60W年薪. 这道面试题是: "请你说一下Mysql索引的优点和缺点" 关于这道题,看看普通人和高手的回答 普通人: 嗯. ...