当前位置: 首页 > news >正文

嵌入式学习Day30---Linux软件编程---进程间的通信

目录

一、Linux操作ipc对象(内存文件)的命令

1.1.查看命令

        1.ipcs

        2.ipcs  -q(查看信息队列)

        3.ipcs -m(查看共享内存)

        4.ipcs -s(查看信号灯)

1.2.删除命令

        1.ipcrm -q id

        2.ipcrm -m id

        3.ipcrm -s id

二、消息队列

2.1.实现步骤

1.创建key(ipc对象名称)值

2.创建消息队列

3.向消息队列中发送信息

4.从消息队列中取出信息

5.删除消息队列

三、共享内存

3.1.实现步骤

1.创建key值

2.创建共享内存

3.建立内存映射

4.取消内存映射

5.销毁共享内存

四、信号灯(与共享内存共用类似与线程中信号)

4.1.实现步骤

1.创建key

2.创建信号灯

3.设置信号灯

4.创建共享内存

5.建立内存映射

6.申请和释放信号灯

7.取消内存映射

8.销毁共享内存

9.删除信号灯

五、总结 


一、Linux操作ipc对象(内存文件)的命令

1.1.查看命令

        1.ipcs

        2.ipcs  -q(查看信息队列)

        3.ipcs -m(查看共享内存)

        4.ipcs -s(查看信号灯)

1.2.删除命令

        前情提要(大写以key删除,小写以id删除),此处不做展示,还未创建新的。

        1.ipcrm -q id

        2.ipcrm -m id

        3.ipcrm -s id

二、消息队列

2.1.实现步骤

1.创建key(ipc对象名称)值

函数接口:ftok

key_t ftok(const char *pathname, int proj_id);功能:创建一个IPC对象名称参数:pathname:文件的路径proj_id:项目ID(8bits)返回值:成功返回IPC对象名称失败返回-1

2.创建消息队列

函数接口:magget

    int msgget(key_t key, int msgflg);功能:创建一个消息队列 参数:key:IPC对象名称 msgflg:消息队列属性IPC_CREAT:创建一个消息队列IPC_EXCL: 如果消息队列存在就报错返回值:成功返回消息队列ID失败返回 -1 

3.向消息队列中发送信息

函数接口:msgsnd

 要自定义他要求的结构体,来写入信息

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);功能:向消息队列中发送消息参数:msqid:消息队列的ID号msgp:发送消息的内容msgsz:发送消息的大小msgflg:消息属性 默认为0 返回值:成功返回0失败返回-1 struct msgbuf {long mtype;       /* message type, must be > 0 */char mtext[1];    /* message data */};

4.从消息队列中取出信息

 函数接口:msgrcv

 ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);功能:从消息队列中接收消息参数:msqid:消息队列的ID号msgp:存放消息的空间首地址msgsz:最多接收消息的大小msgtyp:接收消息的类型 msgflg:消息属性 默认为0返回值:成功返回接收到数据的字节数 失败返回-1 

5.删除消息队列

函数接口:msgctl

int msgctl(int msqid, int cmd, struct msqid_ds *buf);功能:向消息队列发送命令参数:msqid:消息队列的ID号cmd:命令 IPC_STAT:获取消息队列的信息 返回值:成功返回0失败返回-1

三、共享内存

3.1.实现步骤

1.创建key值

 函数接口:ftok

2.创建共享内存

 函数接口:shmget 

int shmget(key_t key, size_t size, int shmflg);功能:创建一个共享内存参数:key:IPC对象名称size:共享内存的大小shmflg:IPC_CREAT  创建 IPC_EXCL   如果存在就报错 返回值:成功返回共享内存ID号失败返回-1 

3.建立内存映射

 函数接口:shmat

void *shmat(int shmid, const void *shmaddr, int shmflg);功能:将地址映射到共享内存中参数:shmid:共享内存ID号shmaddr:NULL: 让系统选择一个合适的地址映射到共享内存中shmflg:属性,默认为0 返回值:成功返回映射到共享空间的地址失败返回NULL

4.取消内存映射

 函数接口:shmdt

int shmdt(const void *shmaddr);功能:解除映射空间参数:shmaddr:映射到共享内存中的地址返回值:成功返回0 失败返回-1

5.销毁共享内存

 函数接口:shmctl

int shmctl(int shmid, int cmd, struct shmid_ds *buf);功能:向共享内存发送命令参数:shmid:共享内存ID号cmd:命令IPC_RMID 删除返回值:成功返回0 失败返回-1 

四、信号灯(与共享内存共用类似与线程中信号)

4.1.实现步骤

1.创建key

函数接口:ftok

2.创建信号灯

函数接口:semget

int semget(key_t key, int nsems, int semflg);   功能:创建信号量数组 参数: key:IPC对象名称nsems:信号量个数semflg:信号量属性IPC_CREAT:创建一个信号量数组返回值:    成功返回0 失败返回-1 

3.设置信号灯

函数接口:semctl

int semctl(int semid, int semnum, int cmd, ...);功能:向信号灯发送命令参数:IPC_RMID    删除信号灯SETVAL      设置第semnum-th信号量的值为arg.val 返回值:成功返回0 失败返回-1 

4.创建共享内存

函数接口:shmget

5.建立内存映射

函数接口:shmat

6.申请和释放信号灯

函数接口:semop

  int semop(int semid, struct sembuf *sops, size_t nsops);功能:对信号量完成申请和释放操作参数:semid:信号灯ID号sops:信号灯操作数组unsigned short sem_num;  //操作信号量的下标short          sem_op;   //对信号量的操作 +1(释放信号量) -1(申请信号量)short          sem_flg;  //SEM_UNDO 操作结束后,信号量的值会恢复到原来的值nsops:数组元素个数  返回值:成功返回0 失败返回-1

7.取消内存映射

函数接口:shmdt

8.销毁共享内存

函数接口:shmctl

9.删除信号灯

函数接口:semctl

int semctl(int semid, int semnum, int cmd, ...);功能:向信号灯发送命令参数:IPC_RMID    删除信号灯SETVAL      设置第semnum-th信号量的值为arg.val 返回值:成功返回0 失败返回-1 

注意:semctl功能很多,这里使用了他的设置和删除功能,其他两种里的也是 。

五、总结 

        2024年8月15日,学习的第30天,满满一个月啦!前几天再练手一个小项目mpalyer项目,发现自己线程中的信号通信还存在问题,还有待加强理解联系。今天学习了多进程的剩余通信方式:消息队列、共享内存、信号灯,其中使用共享内存通信时是异步的,要实现同步需要使用信号灯来实现。 必须深刻理解这三种通信的步骤。

        加油!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 网络通信(TCP/UDP协议 三次握手四次挥手 )
  • Webpack Bundle Analysis:减少包体积的技巧
  • Linux——进程(2)
  • IO多路复用—前言
  • 【OneAPI】中国行政区域省市县编码查询
  • 集成学习:融合多个模型
  • 负载均衡之HAProxy超全内容!!!
  • SDL 与 OpenGL 的关系
  • Vue3学习 Day01
  • 张量补充 2 (补充ing)
  • WPF使用LibVLC.WPF进行本地视频文件播放
  • 【CTF | WEB】003、攻防世界WEB题目之xff_referer
  • 设计模式-享元模式
  • HTTP 之 头部信息(二)
  • Vue3+vite+ts 项目使用mockjs
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • ECMAScript6(0):ES6简明参考手册
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • golang 发送GET和POST示例
  • Promise初体验
  • 分布式任务队列Celery
  • 前端技术周刊 2019-01-14:客户端存储
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 如何实现 font-size 的响应式
  • 数据仓库的几种建模方法
  • 写给高年级小学生看的《Bash 指南》
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 移动端 h5开发相关内容总结(三)
  • 原生js练习题---第五课
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​第20课 在Android Native开发中加入新的C++类
  • # wps必须要登录激活才能使用吗?
  • #162 (Div. 2)
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #vue3 实现前端下载excel文件模板功能
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (2020)Java后端开发----(面试题和笔试题)
  • (39)STM32——FLASH闪存
  • (Charles)如何抓取手机http的报文
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (第30天)二叉树阶段总结
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (每日一问)基础知识:堆与栈的区别
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (十一)图像的罗伯特梯度锐化
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • .apk文件,IIS不支持下载解决
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 设计模式—简单工厂(Simple Factory Pattern)