码农知识堂 - 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()函数,然后需要指定不同的功能,更加详细的操作可以在本系列的其他三篇相关博客里寻找。

  • 相关阅读:
    常用的电源防反接电路
    【Docker】安装及相关的命令
    了解RESTful API设计
    为什么有了 HTTP 还要 RPC
    Android-Handler源码解析-Looper
    stm32同芯片但不同flash工程更换Device出现报错
    【c++】——类和对象(中)——实现完整的日期类(优化)万字详细解疑答惑
    [Spring boot] Spring boot 整合RabbitMQ实现通过RabbitMQ进行项目的连接
    我赢助手之爆款内容创作:这样的内容绝对上不了推荐,看你中招了么?
    Python中的自然语言处理和文本挖掘
  • 原文地址:https://blog.csdn.net/AABond/article/details/133427239
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号