嵌入式Linux--进程间通讯--消息队列

1.需要知道的问题:

        1、如何创建消息队列(A\B使用同一个队列通信)

        2、如何加消息到队列(队列是链表)

        3、如何从队列拿到消息

消息队列:

        消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。

特点:1、消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。

          2、消息队列独立于发送与接收进程。进程终止时,消息队列及其内容不会被删除。

           3、消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

A:①获取队列②读队列

B:①获取队列②写队列
 

2.相关函数

#include <sys/msg.h>
 
//创建或打开消息队列:成功返回队列id,失败返回-1
int msgget(key_t key, int flag);


 
//添加消息:成功返回0,失败返回-1
int msgsnd(int msgid, const void *ptr, size_t size, int flag);
 
//读取消息:成功返回消息数据的长度,失败返回-1
int msgrcv(int msgid, void *ptr, size_t size, long type, int flag);
 
//控制消息队列:成功返回0,失败返回-1
int msgctl(int msgid, int cmd, struct msgid_ds *buf);

ftok函数:

        系统建立IPC通讯(消息队列、信号量和共享内存)时必须指定一个id值。通常情况下,该id值通过ftok函数得到。

ftok原型

#include <sys/types.h>
#include <sys/ipc.h>
 
key_t ftok(const char *pathname, int id);
 
//使用
key_t key;
key=ftok(".",1);//将pathname设为当前目录
                //id是子序号。int型,但是只使用8bit(1-255)

消息队列的移除:

         msgctl(msgid,IPC_RMID,NULL);
 

一般要在结尾加上移除。 

 3.代码:

get.c


#include <sys/msg.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>//创建或打开消息队列:成功返回队列id,失败返回-1
//int msgget(key_t key, int flag);//添加消息:成功返回0,失败返回-1
//int msgsnd(int msgid, const void *ptr, size_t size, int flag);//读取消息:成功返回消息数据的长度,失败返回-1
//int msgrcv(int msgid, void *ptr, size_t size, long type, int flag);//控制消息队列:成功返回0,失败返回-1
//int msgctl(int msgid, int cmd, struct msgid_ds *buf);struct msgbuf{long mtype;char mtext[99];};int main()
{struct msgbuf sendbuf= {35,"thank your message from get"};;struct msgbuf readbuf ;key_t key;key = ftok(".",66);printf("key = %d\n",key);int msgid = msgget(key,IPC_CREAT|0777);if(msgid == -1){printf("id creat failure\n");}msgrcv(msgid,&readbuf,sizeof(readbuf.mtext),25,0);printf("rcv from send :%s\n",readbuf.mtext);sleep(5);msgsnd(msgid,&sendbuf,strlen(sendbuf.mtext),0);msgctl(msgid,IPC_RMID,NULL);return 0;
}

send.c

#include <sys/msg.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>//创建或打开消息队列:成功返回队列id,失败返回-1
//int msgget(key_t key, int flag);//添加消息:成功返回0,失败返回-1
//int msgsnd(int msgid, const void *ptr, size_t size, int flag);//读取消息:成功返回消息数据的长度,失败返回-1
//int msgrcv(int msgid, void *ptr, size_t size, long type, int flag);//控制消息队列:成功返回0,失败返回-1
//int msgctl(int msgid, int cmd, struct msgid_ds *buf);struct msgbuf{long mtype;char mtext[99];};int main()
{struct msgbuf sendbuf = {25,"this message is from sendbuf"};struct msgbuf readbuf;key_t key;key = ftok(".",66);printf("key = %d\n",key);int msgid = msgget(key,IPC_CREAT|0777);if(msgid == -1){printf("id creat failure\n");}msgsnd(msgid,&sendbuf,strlen(sendbuf.mtext),0);msgrcv(msgid,&readbuf,sizeof(readbuf.mtext),35,0);printf("rcv from get :%s\n",readbuf.mtext);msgctl(msgid,IPC_RMID,NULL);return 0;
}

结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】二叉树的前序遍历(七)

题目&#xff1a;二叉树的前序遍历 题目详情&#xff1a;给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历&#xff1b; 我们先来看几个示例&#xff1a; 输入&#xff1a;root [ 1&#xff0c;null&#xff0c;2&#xff0c;3 ] 输出&#xff1a;[ 1&#xf…

爬虫 — Js 逆向案例二微信公众平台登录

目标网站&#xff1a;https://mp.weixin.qq.com/ 需求&#xff1a;找到密码加密的过程&#xff0c;进行加密 案例分析 1、抓到向服务器发请求的数据包&#xff0c;输入错误的账号和密码 2、找到加密字段 pwd 如果 Search 里面数据太多&#xff0c;也可以在 Initiator 里面查找…

LVS+Haproxy

LVSHaproxy 一、Haproxy简介1.1、Haproxy应用分析1.2、Haproxy的特性1.3、常见负载均衡策略1.4、LVS、Haproxy、Nginx区别1.5、 Haproxy的优点1.6、常见的Web集群调度器 二、Haproxy部署实例四、日志定义优化 一、Haproxy简介 Haproxy 是一个使用C语言编写的自由及开放源代码软…

vue项目搭建

一、vue项目搭建&#xff08;如遇问题依据不同情况动态解决搭建过程中的问题&#xff09; VUE官网链接:https://cli.vuejs.org/. node.js下载链接: https://nodejs.cn/download/ 在PATH中配置node的环境变量&#xff0c;node自带npm和npx C:\workSpace>node -v v18.17.0 C…

epoll的并发服务器(TCP服务器与客户端通信)

服务器&#xff1a; #include<myhead.h> #define IP "192.168.250.100" #define PORT 8888 /* typedef union epoll_data {void *ptr;int fd;uint32_t u32;uint64_t u64; } epoll_data_t;struct epoll_event {uint32_t events; …

计算机视觉与深度学习-图像分割-视觉识别任务02-目标检测-【北邮鲁鹏】

目录标题 参考目标检测定义深度学习对目标检测的作用单目标检测多任务框架多任务损失预训练模型姿态估计 多目标检测问题滑动窗口&#xff08;Sliding Window&#xff09;滑动窗口缺点 AdaBoost&#xff08;Adaptive Boosting&#xff09;参考 区域建议 selective search 思想慢…

Spring Cloud Eureka:服务注册与发现

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Spring Cloud Eureka&#xff1a;服务注册与发现 Spring Cloud Eureka是Spring Cloud生态系统中的一个组件&#xff0c;它是用于实现服务注册与发现的服务治理组件。在…

pytorch迁移学习训练图像分类

pytorch迁移学习训练图像分类 一、环境配置二、迁移学习关键代码三、完整代码四、结果对比 代码和图片等资源均来源于哔哩哔哩up主&#xff1a;同济子豪兄 讲解视频&#xff1a;Pytorch迁移学习训练自己的图像分类模型 一、环境配置 1&#xff0c;安装所需的包 pip install …

【ArcGIS】基本概念-矢量空间分析

栅格数据与矢量数据 1.1 栅格数据 栅格图是一个规则的阵列&#xff0c;包含着一定数量的像元或者栅格 常用的栅格图格式有&#xff1a;tif&#xff0c;png&#xff0c;jpeg/jpg等 1.2 矢量数据 矢量图是由一组描述点、线、面&#xff0c;以及它们的色彩、位置的数据&#x…

堆内存与栈内存

文章目录 1. 栈内存2. 堆内存3. 区别和联系参考资料 1. 栈内存 栈内存是为线程留出的临时空间 每个线程都有一个固定大小的栈空间&#xff0c;而且栈空间存储的数据只能由当前线程访问&#xff0c;所以它是线程安全的。栈空间的分配和回收是由系统来做的&#xff0c;我们不需…

如何玩转CSDN AI工具集

前言 人工智能生成内容&#xff08;AIGC&#xff09;是当下最具有前景的技术领域之一。AI能够以惊人的速度和准确度生成各种类型的内容&#xff0c;完成文章翻译、代码生成、AI对话、插图创作等工作&#xff0c;带来了许多令人兴奋的机遇。 本文将介绍CSDN AI工具集的基本使用…

「大数据-0」虚拟机VMware安装、配置、使用、创建虚拟机集群教程

目录 一、下载VMware Wworkstation Pro 16 二、安装VMware Wworkstation Pro 16 三、检查与设置VMware的网卡 1. 检查 2. 设置VMware网段 四、在VMware上安装Linux虚拟机 五、对安装好的虚拟机进行设置 1. 打开设置 2. 设置中文 3. 修改字体大小 4. 修改终端字体大小 5. 关闭虚…

pip pip3安装库时都指向python2的库

当在python3的环境下使用pip3安装库时&#xff0c;发现居然都指向了python2的库 pip -V pip3 -V安装命令更改为&#xff1a; python3 -m pip install <package>

【操作系统笔记】内存寻址

物理寻址 主存&#xff08;内存&#xff09; 计算机主存也可以称为物理内存&#xff0c;内存可以看成由若干个连续字节大小的单元组成的数组每个字节都有一个唯一的物理地址&#xff08;Physical Address&#xff09;CPU访问内存前&#xff0c;先拿到内存地址&#xff0c;然后…

【数据结构】二叉树的链式实现及遍历

文章目录 一、二叉树的遍历1、前序遍历2、中序遍历3、后序遍历4、层序遍历 二、二叉树结点个数及高度1、二叉树节点个数2、二叉树叶子节点个数3、二叉树第k层节点个数4、二叉树查找值为x的节点 三、二叉树创建及销毁1、通过前序遍历数组创建二叉树2、二叉树的销毁3、判断是否为…

Pytest单元测试框架 —— Pytest+Allure+Jenkins的应用

一、简介 pytestallurejenkins进行接口测试、生成测试报告、结合jenkins进行集成。 pytest是python的一种单元测试框架&#xff0c;与python自带的unittest测试框架类似&#xff0c;但是比unittest框架使用起来更简洁&#xff0c;效率更高 allure-pytest是python的一个第三方…

IMX6ULL移植篇-Linux内核源码文件表

一. Linux内核源码目录 我们在分析 Linux 之前&#xff0c;一定要先在 Ubuntu 中编译一下 Linux &#xff0c;因为编译过程会生成一些文件&#xff0c;而生成的这些恰恰是分析 Linux 不可或缺的文件。 二. Linux内核源码重要文件含义 编译后的 Linux内核源码重要的文件…

修改接口,字段的内容允许清空,避免歧义,参数校验:@NotNull

1. 问题描述 修改接口&#xff0c;字段的内容允许清空&#xff0c;是否应该做参数校验&#xff1f;如何做参数校验&#xff1f; 2. 说明 2.1. 需要对字段进行校验。 因为不校验&#xff0c;字段可能不传&#xff0c;或者字段的值为null&#xff1b;这样无法判断出&#xff…

【Linux基础】第27讲 Linux 查找和过滤命令(二)——grep命令

Grep命令 grep是根据文件的内容进行查找&#xff0c;会对文件的每一行按照给定的模式&#xff08;patter&#xff09;进行匹配查找 基本格式&#xff1a; grep [options]范围 [options] 主要参数 -c: 只输出匹配行的计数 -i : 不区分大小写 -n: 显示匹配行及行号 -w: 显示整个…

[Linux入门]---文本编辑器vim使用

文章目录 1.Linux编辑器-vim使用2.vim的基本概念4.vim正常模式命令集从正常模式进入插入模式从插入模式转换为命令模式移动光标删除文字复制替换撤销更改跳至指定行 5.vim末行模式命令集5.总结 1.Linux编辑器-vim使用 vi/vim作为Linux开发工具之一&#xff0c;从它的键盘操作图…