码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Linux系统编程系列之进程间通信-IPC对象


     Linux系统编程系列(16篇管饱,吃货都投降了!)

            1、Linux系统编程系列之进程基础

            2、Linux系统编程系列之进程间通信(IPC)-信号

            3、Linux系统编程系列之进程间通信(IPC)-管道

            4、Linux系统编程系列之进程间通信-IPC对象

            5、Linux系统编程系列之进程间通信-消息队列

            6、Linux系统编程系列之进程间通信-共享内存

            7、Linux系统编程系列之进程间通信-信号量组

            8、Linux系统编程系列之守护进程

            9、Linux系统编程系列之线程

            10、Linux系统编程系列之线程属性 

            11、Linux系统编程系列之互斥锁和读写锁

            12、Linux系统编程系列之线程的信号处理

            13、Linux系统编程系列之POSIX信号量

            14、Linux系统编程系列之条件变量

            15、Linux系统编程系列之死锁

            16、 Linux系统编程系列之线程池

    一、什么是IPC对象

            消息队列,共享内存和信号量组被称为IPC对象。各种不同的IPC其实是在不同时期逐步引入的,他们是在UNIX伯克利版本system-V中引入的三种通信方式。

    二、IPC对象特性

            1、在系统中使用键值(KEY)来唯一确定,类似文件系统中的文件路径。

            2、当某个进程创建(或打开)一个IPC对象时,将会获得一个整形ID,类似文件描述符。

            3、IPC对象属于系统,而不是进程,因此在没有明确删除操作的情况下,IPC对象不会因为进程的退出而消失。

    三、IPC相关操作命令

            1、查看IPC对象

                    (1)、查看所有IPC对象

    ipcs -a # 查看所有IPC对象

            (2)、查看所有消息队列

    ipcs -q

            (3)、查看所有共享内存

    ipcs -m

             (4)、查看所有信号量组

    ipcs -s

            2、创建IPC对象

            在IPC通信对象中不管需要使用共享内存、信号量组、消息队列,都需要经历以下步骤:

            (1)先获得通信对象的KEY值(相当于确定系统中某一个唯一的文件)

            (2)把KEY值所对应的通信对象设置为指定的功能(共享内存,信号量组,消息队列)

            获得通信对象的KEY值使用ftok()

    1. #include
    2. #include
    3. // 函数原型
    4. key_t ftok(const char *pathname, int proj_id);
    5. // 参数分析:
    6. pathname --> 随便写一个路径名但必须是真实存在的(建议使用当前路径)
    7. proj_id --> 随便写一个整型,用于区分在同一个项目汇总不同的对象
    8. // 返回值:
    9. 成功 返回通信对象的KEY值
    10. 失败 返回-1

            具体如何创建请移步到本系列另外的三篇相关博客有详细介绍,这里做简单演示。 

            (1)、创建消息队列

    1. // IPC对象的案例
    2. #include
    3. #include
    4. #include
    5. #include
    6. int main(int argc, char *argv[])
    7. {
    8. // 1、获取KEY值
    9. key_t msg_key = ftok("./", 666);
    10. if(msg_key == -1)
    11. {
    12. perror("ftok fail");
    13. }
    14. // 2、指定功能为消息队列
    15. int msg_id = msgget(msg_key, IPC_CREAT|0666);
    16. if(msg_id == -1)
    17. {
    18. perror("msgget fail");
    19. }
    20. return 0;
    21. }

            (2)、创建共享内存

    1. // IPC对象的案例
    2. #include
    3. #include
    4. #include
    5. #include
    6. int main(int argc, char *argv[])
    7. {
    8. // 1、获取KEY值
    9. key_t shm_key = ftok("./", 666);
    10. if(shm_key == -1)
    11. {
    12. perror("ftok fail");
    13. }
    14. // 2、指定功能为共享内存
    15. int shm_id = shmget(shm_key, 4096, IPC_CREAT|0666);
    16. if(shm_id == -1)
    17. {
    18. perror("shmget fail");
    19. }
    20. return 0;
    21. }

            (3)、创建信号量组

    1. // IPC对象的案例
    2. #include
    3. #include
    4. #include
    5. #include
    6. int main(int argc, char *argv[])
    7. {
    8. // 1、获取KEY值
    9. key_t sem_key = ftok("./", 666);
    10. if(sem_key == -1)
    11. {
    12. perror("ftok fail");
    13. }
    14. // 2、指定功能为信号量组
    15. int sem_id = semget(sem_key, 10, IPC_CREAT|0666);
    16. if(sem_id == -1)
    17. {
    18. perror("semget fail");
    19. }
    20. return 0;
    21. }

            3、删除IPC对象

            (1)、删除消息队列

    1. ipcrm -Q key # 使用KEY值来删除
    2. ipcrm -q id # 使用消息队列的ID来删除

            (2)、删除共享内存

    1. ipcrm -M key # 使用KEY值来删除
    2. ipcrm -m id # 使用共享内存ID来删除

            (3)、删除信号量组

    1. ipcrm -S key # 使用KEY值来删除
    2. ipcrm -s id # 使用信号量组ID来删除

    四、总结

             这里对IPC对象进行简单介绍,IPC对象用唯一的key值来确定,但是不同类型的IPC对象的KEY值可以相同,上面已经验证。获取key值使用ftok()函数,然后需要指定不同的功能,更加详细的操作可以在本系列的其他三篇相关博客里寻找。

  • 相关阅读:
    【计算机网络】HTTP 重定向
    十二、【VUE-CLI】消息订阅与发布(待办事项案例 · 第五版)
    springboot项目中定时任务注解@Scheduled未按cron表达式执行
    BootLoader为什么要分阶段?
    微信小程序之会议OA首页数据交互,会议状态,会议人数转换,会议室交互,WXS的使用
    树莓派4B配置ubuntu18.04.5
    WEB前端网页设计 CSS网页代码 基础参数(三)
    对话框管理器第四章:对话框消息循环
    牛客 NC24307 [USACO 2012 Dec S]Milk Routing
    网络层总结(未完待续)
  • 原文地址:https://blog.csdn.net/AABond/article/details/133427239
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号