Linux下IPC之共享内存的使用方法

基本参考 《Unix环境高级编程》 第14.9节共享内存来学习。

需要说明的

讲shmget(key,size, flag)函数时,书上大概意识是说,

想访问已有的shm时,key不应与IPC_CREATE 同时指定。

  • 已有此key的shm且size满足要求(已有shm的size ≥ 函数中指定的size)时,直接返回已有的shmid。
    若size不满足,则失败返回-1
  • 若未有此key的shm,则使用 key 和 size 创建新的IPC结构,并返回shmid;创建失败则返回-1.

点击查看代码

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&#xFF0C;&#x4F20;&#x5165;&#x7684;&#x6587;&#x4EF6;SHM_PATH&#x5FC5;&#x987B;&#x5B58;&#x5728;(&#x6743;&#x9650;&#x4E0D;&#x8981;&#x6C42;)&#xFF0C;&#x5426;&#x5219;&#x5931;&#x8D25;&#x8FD4;&#x56DE;-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 (int)key ); 先尝试获取已有的shm 0, 0); retrive momory (int)key); -1; 查看获取的shm的size struct shmid_ds * buf; rst="shmctl(shmid," ipc_stat, buf); if(buf->shm_segsz != SHM_SIZE){
    //         printf("The retrived SHM has different size.\n");
    //         return -1;
    //     }
    // }

    //&#x83B7;&#x53D6;&#x6B64;key&#x5DF2;&#x6709;&#x7684;&#x5171;&#x4EAB;&#x5185;&#x5B58;shm,&#x672A;&#x627E;&#x5230;&#x65F6;&#x521B;&#x5EFA;&#x65B0;&#x7684;.[&#x53EF;&#x66FF;&#x4EE3;&#x4E0A;&#x9762;&#x7684;&#x624B;&#x52A8;&#x68C0;&#x7D22;!]
    int shmid = shmget(key, SHM_SIZE, IPC_CREAT);

    //attach&#x5230;&#x8FDB;&#x7A0B;&#x7A7A;&#x95F4;
    char * addr = shmat(shmid, NULL , 0);
    if(addr <= 0 ){ printf("failed to attach share memory.\n"); return -1; } 使用shm,写入 sprintf(addr, "%s", "共享内存,您好~\n"); 0; < code></=></0){></sys></sys></sys></unistd.h></stdio.h>

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); 0); if(shmid <0){ printf("failed to retrive share memory.\n"); -1; * addr="shmat(shmid," null, shm_rdonly); 只读挂载 if(addr<="0){" map 使用shm,打印字符串. strcpy(buf, addr); printf("%s", buf); 可以直接打印,不必strcpy; 但得考虑同步问题,防止读写并发冲突。 0; < code></0){></sys></sys></sys></unistd.h></string.h></stdio.h>

Original: https://www.cnblogs.com/zhw618/p/15854216.html
Author: zhw618
Title: Linux下IPC之共享内存的使用方法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581790/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • tomcat

    tomcat 一.简介 二.部署tomcat 一.简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场…

    Linux 2023年6月7日
    0111
  • Docker从入门到精通

    1 容器简介1.1 什么是 Linux 容器1.2 容器不就是虚拟化吗1.3 容器发展简史2 什么是 Docker?2.1 Docker 如何工作?2.2 Docker 技术是否与…

    Linux 2023年6月7日
    089
  • Redis

    一、Redis的介绍 什么是Redis Redis是一个开源的使用ANSI C语言编写Key-Value内存数据库 读写性能强,支持多种数据类型 把数据存储在内存中的高速缓存 Re…

    Linux 2023年6月14日
    085
  • Java动态脚本Groovy读取配置文件

    前言:请各大网友尊重本人原创知识分享,谨记本人博客: 南国以南i 核心涉及: @Value:作用是通过注解将常量、配置文件中的值、其他bean的属性值注入到变量中,作为变量的初始值…

    Linux 2023年6月14日
    082
  • Identity Server 4客户端认证控制访问API(一)

    一、说明 我们将定义一个api和要访问它的客户端,客户端将在identityser上请求访问令牌,并使用访问令牌调用api 二、项目结构与准备 1、创建项目QuickStartId…

    Linux 2023年6月13日
    0102
  • thinkphp3.2.3 使用redis session存储

    为了解决session 共享问题,使用redis存储session会话信息 首先我们先研究一下 thinkphp 底层是怎么调用session的 ThinkPHP/Library/…

    Linux 2023年5月28日
    088
  • Red Hat Enterprise Linux (RHEL) 8.5 发布(含下载)

    2021 年 11 月 10 日,红帽企业 Linux (RHEL) 8.5 现已正式发布 (GA),并带来了新功能和改进,以帮助简化部署、优化性能并帮助降低环境中的风险。无论您的…

    Linux 2023年5月27日
    0114
  • Docker 搭建 Nexus3 私服 | 基本操作

    1 Docker 安装 Nexus3 1.1 创建目录 在硬盘上创建 Nexus3 的主目录: mkdir -p /Users/yygnb/dockerMe/nexus3 为该目录…

    Linux 2023年6月7日
    082
  • UDS诊断应用层笔记

    UDS概述 UDS(Unified Diagnostic Services,统一的诊断服务)诊断协议是在汽车电子ECU环境下的一种诊断通信协议,在 ISO 14229中规定。它是从…

    Linux 2023年6月13日
    0116
  • Redis 常用五种数据类型编码

    1.String 1.1 常用命令 (1)设置值 set key value [ex seconds] [px milliseconds] [nx|xx] set命令有几个选项: …

    Linux 2023年5月28日
    099
  • 中土批量运维神器《ps1屠龙刀》 pk 西域批量运维圣器《ansible圣火令》

    据故老相传,运维界有句话:”脚林至尊,宝刀【ps1屠龙】,号令被控,莫敢不从”。 https://gitee.com/chuanjiao10/kasini3…

    Linux 2023年5月27日
    0117
  • Linux i3 用户手册(简要)

    i3 用户手册 与(mod一起使用的键 一般为Win键或为Alt键, 可以和与 Shift+\)mod 一起使用 按键参考图 红色键是您需要按下的修饰符(默认情况下),蓝色键是您的…

    Linux 2023年6月7日
    097
  • 网络中冗余备份

    冗余备份的重要性 如今社会,网络是各个产业的新的血脉,网络的稳定性至关重要,一旦网络出现故障,导致断网、延迟丢包等很可能会导致生产作业停滞,造成较经济损失,为此冗余备份至关重要,从…

    Linux 2023年6月6日
    0128
  • 华为云服务器数据库配置远程连接

    华为云服务器数据库配置远程连接 起因 暑期购买了华为云的一台服务器进行开发 在上面部署了MySQL数据库,由于app中修改用户信息存在未修复的bug,经常会出现登录密码为空,导致账…

    Linux 2023年6月13日
    0138
  • OrchardCore Headless建站拾遗

    书接上回,OrchardCore的基本设置写了,但是有一说一,这个东西还是挺复杂的,如果需要构建一个简单的企业网站,还需要干点别的活。 本文考虑在尽量少编程的基础上,完成一个Hea…

    Linux 2023年6月6日
    0106
  • jquery ajax提交数据给后端

    大家好,今天铁柱兄给大家带一段jquery ajax提交数据给后端的教学。 初学javaweb的同学前端提交数据基本上都是用form表单提交,这玩意儿反正我是觉得不太好玩。而Jav…

    Linux 2023年6月13日
    091
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球