码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • linux进程间通信之共享内存


    目录

    一,共享内存原理

    二,创建共享内存

    1,shmget创建共享内存

    2,shmat挂接共享内存

    3,shmdt取消挂接共享内存

    4,shmctl删除共享内存

    三,代码使用

    1,com.hpp

    2,ipc_client.cpp

    3,ipc_server.cpp

    4,makefile

    5,log.hpp

    四,实验现象

    五,添加管道控制

    1,封装几个管道接口

    2,客户端

    3,服务端

    4,实验现象

    六,代码链接


    一,共享内存原理

    还是和上一节一样,俩个进程要通信,那么他俩就需要看到同一块资源,如图所示就是他的原理:
     

    所以我们可以知道共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据

    二,创建共享内存

    四个函数

    1,shmget创建共享内存

    key需要用户自己提供:

    需要用户调用ftok函数来给出:

    这里使用和上一节的命名管道差不多,提供相同的路径,和一个int值,生成一个定值key_t,这样俩个进程只要是提供的路径相同,数字相同,就会得到同一个key_t,参考命名管道。

    size:创建的大小:

    shmflg:创建的方法和权限

    IPC_CREAT:没有则创建,有了就返回创建好的。

    IPC_EXCL:有了则出错返回,这个不单独使用,和IPC_CREAT,配合,用来保证创建的共享内存是新创建的,而不是以及创建好了。

    这个函数的返回值就标定了一块共享内存,并且是唯一标定的。

    2,shmat挂接共享内存

    shmid:shmget的返回值

    shnadder:从哪里挂接,我们一般不知道因该是特殊用途,设置为nullptr就好了,系统自动选择。

    shmflag:传0使用默认读写就行了,

    shmat的返回值是void* ,参考malloc开出的空间,差不多一样,就当malloc开出的空间那样使用就好了。

    3,shmdt取消挂接共享内存

    shmat的返回值传入就取消了。

    4,shmctl删除共享内存

    这里我们主要看删除,是因为共享内存的生命周期不是随进程的,而是随内核的。

    第一个参数传shmget返回值,

    第二个传IPC_RMID,

    第三个是为了设置共享内存信息IPC_SET,或者IPC_STAT输出型参数带回共享内存的信息,用的时候在看文档把。

    三,代码使用

     整体代码文件有七个,其实主要就三个

    makfile是编译代码的

    log.hpp搞日志的,为了方便,可以不搞得,

    com.hpp头文件

    ipc_client:客户端,也就是进程1

    ipc_server:服务端,也就是进程2

    剩下俩个是生成得可执行程序

    1,com.hpp

    2,ipc_client.cpp

    3,ipc_server.cpp

    4,makefile

     

    5,log.hpp

    无所谓得这个:

    四,实验现象

    我们也是发现了,共享内存是没有同步互斥机制得,我们想要同步互斥机制得话可以配合命名管道来使用。

    我们关掉进程:发现共享内存没有释放,验证了他是随内核得。

    ipccrm -m shmid;手动删除,就没有了

    五,添加管道控制

    共享内存是没有同步互斥机制得,我们加入一个命名管道来通知他的读取,让他不是随便想读就读。而是在我们写完一句话再去读取,没写完就让他等在那里。

    1,封装几个管道接口

    管道不会得,前面有讲过哦。

    2,客户端

    客户端开始时打开管道。

    写完之后唤醒

    3,服务端

    开始时创建管道并打开

    在读取得时候按照管道得读取来进行等待

    4,实验现象

    这就好了,呀就不会随意得读取了,而是和管道同步起来。 

     

    六,代码链接

    lyh_linux-test: linux代码练习。 - Gitee.com

    lyh_linux-test: linux代码练习。 - Gitee.com

  • 相关阅读:
    adb控制常用命令
    ICCV 2023 | MPI-Flow:从单视角构建的多平面图像中学习光流
    htb-nineveh
    http(下)
    ssm驾考预约管理系统设计与实现毕业设计源码250910
    ttkefu客服系统的优势及应用领域
    Linux系列之查找命令
    java中使用jacob实现word转pdf文件下载
    Java面向对象七大原则以及设计模式单例模式和工厂模式简单工厂模式
    【Spring Boot】日志文件
  • 原文地址:https://blog.csdn.net/weixin_50374599/article/details/127686475
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号