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)

大家都在看

  • jmeter的一些概念知识

    前言 一、Jmeter的作用 – 1.jmeter进行接口操作 2. jmeter进行性能操作 二、Jmeter的一些概念的理解 – 1.事务 2. TPS…

    Linux 2023年6月14日
    0106
  • 对比powershell,点评:《七年老运维实战中的 Shell 开发经验总结》

    前言: 《七年老运维实战中的 Shell 开发经验总结》是不错的帖子,建议shell用户搜看。 点评:《七年老运维实战中的 Shell 开发经验总结》 shell除了上述问题外,还…

    Linux 2023年6月14日
    088
  • PYTORCH: 60分钟 | TENSORS

    Tensor是一种特殊的数据结构,非常类似于数组和矩阵。在PyTorch中,我们使用tensor编码模型的输入和输出,以及模型的参数。Tensor类似于Numpy的数组,除了ten…

    Linux 2023年6月16日
    0170
  • Lvs

    Lvs Lvs Lvs简介 体系结构 LVS管理工具 配置 lvs-nat 模式的 httpd 负载集群—http 配置lvs-nat模式的httpd负载集群&#821…

    Linux 2023年6月6日
    0114
  • linux 僵尸进程处理

    什么是僵尸进程 我们启动一个程序,开始我们的任务,然后等任务结束了,我们就停止这个进程。 进程停止后, 该进程就会从进程表中移除。 但是,有时候有些程序即使执行完了也依然留在进程表…

    Linux 2023年6月6日
    0102
  • CentOS-7配置fastDFS文件服务器和安装Nginx

    配置步骤实在是很繁琐,听我慢慢道来! 主要是配置管理(tracker)和存储(storage)返回地址样式 –> 域名/组名/磁盘名/目录名/文件名 &#8211…

    Linux 2023年6月13日
    085
  • __pycache__

    最近在使用python写一个串口模块的时候,偶然发现运行脚本之后,在工程文件夹下面出现了这样一个文件夹__pycache__,所以就特意到网上查了一下这个文件夹是怎么回事。 &am…

    Linux 2023年6月14日
    0109
  • 轻量级多级菜单控制框架程序(C语言)

    1、前言 作为嵌入式软件开发,可能经常会使用命令行或者显示屏等设备实现人机交互的功能,功能中通常情况都包含 UI 菜单设计;很多开发人员都会有自己的菜单框架模块,防止重复造轮子,网…

    Linux 2023年6月7日
    0113
  • EhCache缓存页面、局部页面和对象缓存

    页面缓存:SimplePageCachingFilter web.xml <filter> <filter-name>PageEhCacheFilterfi…

    Linux 2023年6月13日
    099
  • angular报错:Cannot assign to a reference or variable

    错误代码: <input #manufacturerId="ngModel" id="manufacturerId" name=&qu…

    Linux 2023年6月7日
    093
  • 【设计模式】Java设计模式-原型模式

    【设计模式】Java设计模式 – 原型模式 😄 不断学习才是王道🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆原创作品,更多关注我CSDN: 一个…

    Linux 2023年6月6日
    0117
  • brew安装与启动redis

    安装 检查是否安装成功 启动 检查是否启动成功 参考 安装 brew install redis 检查是否安装成功 启动 brew services start redis &am…

    Linux 2023年6月6日
    0112
  • ToneGenerator Init failed Crash 崩溃

    需求需要在扫码时产生一个短促的提示音, 搜了下像这样实现。测试时发现多次扫码后,会触发程序崩溃问题。 异常如下 代码如下: 一番搜索, 以下为最佳答案, 加上以后,循环测试, 不再…

    Linux 2023年6月13日
    091
  • Snap Build Your Own Block修炼之道-添加自定义类别

    Snap Build Your Own Block自我修炼方法:1、所有的面向对象,其实是对面向过程的抽象过程而已; 2、面对别人的开源项目时,需要找准源头(即项目运行的起点,当然…

    Linux 2023年6月6日
    094
  • SSH免密登录

    SSH免密登录实现三步: 客户端生成公钥和私钥 上传公钥到服务端 SSH免密登录 (1) 客户端生成和公钥和私钥 ssh-keygen 一路回车即可,默认会在~/.ssh/目录下创…

    Linux 2023年6月7日
    092
  • 快速登陆linux服务器

    前言 本文适用于喜欢原生终端的用户,钟爱第三方ssh客户端的可以无视….客户端可以保存用户信息和密码,比较无脑。mac可以使用终端,win可以使用git的bash。 上…

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