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)

大家都在看

  • MySQL——锁和事务管理

    保证数据安全的一种手段。防止数据文件同时被多个用户同时修改,从而造成数据的破坏。 读锁:S锁,例如给一个表加了读锁以后,大家都能读表里面的内容(只能读不能改) 写锁:X锁。加了写锁…

    Linux 2023年6月7日
    086
  • java程序使用ssl证书连接mysql

    bash;gutter:false; 1. 在mysql服务器上生成证书 openssl genrsa 2048 > ca-key.pem openssl req -new …

    Linux 2023年6月7日
    0104
  • linux用户身份与文件权限

    tips:可以将安装好的系统设置为一次快照,这样即便系统彻底崩溃了,也可以在5秒的时间内快速还原出一台全新的系统,而不用担心数据丢失 1、用户身份和能力 Linux系统的管理员之所…

    Linux 2023年5月27日
    098
  • 2021年3月-第02阶段-前端基础-移动WEB开发-移动WEB开发_rem布局

    移动web开发之rem布局 rem基础 rem单位 rem (root em)是一个相对单位,类似于em,em是父元素字体大小。 不同的是rem的基准是相对于html元素的字体大小…

    Linux 2023年6月8日
    0110
  • 利用Hugo与GitHub仓库搭建免费的个人博客

    软件下载 配置环境变量 检验环境变量 创建博客文件 创建站点文件夹 下载主题 新建博客 将个人博客部署到github存储仓库 保姆级 基于Win10环境下的Hugo免费博客搭建 软…

    Linux 2023年6月7日
    0127
  • Java List和Map遍历的方法,forEach()的使用

    注意: 不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。 Java 8之前 …

    Linux 2023年6月7日
    0111
  • Java基础系列–09_集合2

    昨天介绍了集合的主要架构体系,今天主要的目的是学习集合的迭代器的遍历和List的特有功能。 迭代器:概述: 由于多种集合的数据结构不同,所以存储方式不同,取出方式也不同。但是他们都…

    Linux 2023年6月7日
    079
  • 【docker】python: can’t open file ‘helloworld.py’: [Errno 13] Permission denied

    运行容器提示权限问题 docker run -v $PWD/myapp:/usr/src/myapp -w /usr/src/myapp python:3.5 python hel…

    Linux 2023年6月7日
    0112
  • Shell实现:基本功能

    独立博客阅读地址:https://panqiincs.me/2017/02/26/write-a-shell-basic-functionality/ Shell的功能 Shell…

    Linux 2023年6月7日
    0137
  • 面试题汇总

    JAVA 基础 1.java 性能优化 ①尽量指定类、方法的final 修饰符 ②尽量重用对象 ③尽可能使用局部变量 ④及时关闭流 ⑤尽量减少对变量的重复计算 ⑥尽量采用懒加载的策…

    Linux 2023年6月7日
    094
  • 关于阿里云ECS Centos 5/6/7 Linux Glibc库严重安全漏洞修复方法

    本文来自转载http://www.shidehui.com/jingyan/about-ali-cloud-ecs-centos-567-linux-glibc-library-s…

    Linux 2023年6月13日
    0131
  • Python 练习题:用索引取出LIST中的值

    请用索引取出下面list的指定元素,分别为Apple,Python,Lisa -*- coding: utf-8 -*- 请用索引取出下面list的指定元素 L = [ [‘App…

    Linux 2023年6月8日
    0103
  • flask 之 请求钩子

    请求钩子 什么是请求钩子? 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要统一处理,为了让每个视图函数避免编写重复功能的代码, flask提供了统一的接口可以添加这些处理…

    Linux 2023年6月8日
    0107
  • 数据结构 单链表

    cpp;gutter:true;</p> <h1>include</h1> <h1>define null 0;</h1&gt…

    Linux 2023年6月13日
    084
  • 操作系统实现-printk

    博客网址:www.shicoder.top微信:18223081347欢迎加群聊天 :452380935 这一次我们来实现最基础,也是最常见的函数 print,大家都知道这个是可变…

    Linux 2023年6月13日
    0111
  • Linux中CentOS 7版本安装JDK、Tomcat、MySQL、lezsz、maven软件详解

    软件安装 在Linux系统中,安装软件的方式主要有四种,这四种安装方式的特点如下: 安装方式 特点 二进制发布包安装 软件已经针对具体平台编译打包发布,只要解压,修改配置即可 rp…

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