C语言 消息队列

2023-05-16

消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点。作为早期unix通信机制之一的信号能够传送的信息量有限,后来虽然POSIX 1003.1b在信号的实时性方面作了拓广,使得信号在传递信息量方面有了相当程度的改进,但是信号这种通信方式更像"即时"的通信方式,它要求接受信号的进程在某个时间范围内对信号做出反应,因此该信号最多在接受信号进程的生命周期内才有意义,信号所传递的信息是接近于随进程持续的概念(process-persistent);管道及有名管道则是典型的随进程持续IPC,并且,只能传送无格式的字节流无疑会给应用程序开发带来不便,另外,它的缓冲区大小也受到限制。
消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。消息队列是随内核持续的。
目前主要有两种类型的消息队列:POSIX消息队列以及系统V消息队列,系统V消息队列目前被大量使用。考虑到程序的可移植性,新开发的应用程序应尽量使用POSIX消息队列。
系统V消息队列是随内核持续的,只有在内核重起或者显式删除一个消息队列时,该消息队列才会真正被删除。因此系统中记录消息队列的数据结构(struct ipc_ids msg_ids)位于内核中,系统中的所有消息队列都可以在结构msg_ids中找到访问入口。 消息队列就是一个消息的链表。每个消息队列都有一个队列头,用结构struct msg_queue来描述。队列头中包含了该消息队列的大量信息,包括消息队列键值、用户ID、组ID、消息队列中消息数目等等,甚至记录了最近对消息队列读写进程的ID。读者可以访问这些信息,也可以设置其中的某些信息。


发送端

/*************************************************************************
	> File Name: msg_send.c
	> Author: kid
	> Mail: 280197326@qq.com 
	> Created Time: 2014年03月01日 星期六 23时15分47秒
 ************************************************************************/

#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<linux/msg.h>
#define MAXMSG 512
struct my_msg   //消息队列结构体
{
	long int my_msg_type;
	int i;
	char some_text[MAXMSG];
}msg;
main()
{
	int msgid;
	char buffer[BUFSIZ];
	msgid=msgget(12,0666|IPC_CREAT);  //创建消息队列

	while(1){
		puts("Enter some text:");
		fgets(buffer,BUFSIZ,stdin);
		msg.i++;
		printf("i=%d\n",msg.i);
		msg.my_msg_type=3;
		strcpy(msg.some_text,buffer);
		msgsnd(msgid,&msg,MAXMSG,0);   //发送数据到缓冲区
		if(strncmp(msg.some_text,"end",3)==0){   //比较输入,若为end则跳出循环
		    break;
        }
    }
	exit(0);
}

接收端

/*************************************************************************
	> File Name: msg_receive.c
	> Author: kid
	> Mail: 280197326@qq.com 
	> Created Time: 2014年03月01日 星期六 23时24分02秒
 ************************************************************************/

#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<linux/msg.h>

#define MAXMSG 512
struct my_msg
{
	long int my_msg_type;
	int i;
	char some_text[MAXMSG];
}msg;
main()
{
	int msgid;
	msg.my_msg_type=3;
	msgid=msgget(12,0666|IPC_CREAT);
	while(1)
	{
		msgrcv(msgid,&msg,BUFSIZ,msg.my_msg_type,0);
		printf("You wrote:%s and i=%d\n",msg.some_text,msg.i);
		if(strncmp(msg.some_text,"end",3)==0)
			break;
	}
	msgctl(msgid,IPC_RMID,0);
	exit(0);
}




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言 消息队列 的相关文章

  • Docker安装Kafka消息队列

    文章目录 1 安装zookeeper2 安装kafka3 安装kafka map xff08 可选 xff09 1 安装zookeeper span class token function docker span run span cla
  • Docker安装RockerMQ消息队列

    文章目录 1 安装namesrv2 安装broker3 安装console xff08 可选 xff09 1 安装namesrv namesrv就类似于消息队列的注册中心 span class token function docker s
  • FreeRTOS消息队列

    FreeRTOS消息队列 队列又称消息队列 xff0c 是一种常用于任务间通信的数据结构 xff0c 队列可以在任务与任务间 中断和任务间传递信息 xff0c 实现了任务接收来自其他任务或中断的不固定长度的消息 xff0c 任务能够从队列里
  • 【UCOSIII操作系统】消息队列篇(1)消息队列

    UCOSIII操作系统 UCOSIII操作系统 消息队列篇 xff08 1 xff09 消息队列消息队列常用函数消息队列概念简介创建消息队列 gt OSQCreate 消息队列删除 gt OSQDel 消息队列发送 gt OSQPost 消
  • RocketMQ第二篇 单机版安装操作步骤

    MQ下载地址 下载RocketMQ 4 7 1版本 RocketMQ运行版本下载地址 https archive apache org dist rocketmq 4 7 1 rocketmq all 4 7 1 bin release z
  • Windows下安装RocketMQ、配置可视化界面

    1 下载RocketMQ 官网下载地址 https rocketmq apache org dowloading releases 2 安装及启动 1 前提条件 已安装jdk和maven 注意jdk安装路径不能有空格 否则启动mq时会报类加
  • 消息队列mq总结

    转自 http blog csdn net konglongaa article details 52208273 http blog csdn net oMaverick1 article details 51331004 https y
  • RabbitMQ高级特性-Confirm确认消息

    Confirm确认消息 消息的确认 是指生产者投递消息后 如果Broker收到消息 则会给我们产生一个应答 生产者进行接收应答 用来确定这条消息是否正常发送到Broker 这种方式也是消息的可靠性投递的核心保障 如何实现Confirm确认消
  • 【Linux】利用消息队列实现一个简单的进程间双向通信(两种方式)

    在实现利用消息队列的进程间通信之前 先了解一下基本的概念和所需要用到的函数 消息队列 消息队列是Linux内核地址空间中的内部链表 各个进程可以通过它来进行消息传递 进程发送的消息会顺序写入消息队列之中 且每个消息队列都有IPC标识符唯一地
  • RocketMQ系列之集群搭建

    前言 上节我们对RocketMQ 以下简称RMQ 有了一些基本的认识 大致知道了 什么是RMQ以及他能做什么 今天我们来讲讲如何搭建RMQ 与其说搭建RMQ不如说是搭建RMQ集群 为什么这么说呢 看完这篇文章自然就懂了 RMQ几个重要角色
  • RocketMQ-实际开发中遇到的几个问题

    消息幂等性 什么是幂等性 一个操作任意执行多次与执行一次的结果相同 这个操作就是幂等 生产者发送消息之后 为了确保消费者消费成功 我们通常会采用手动签收方式确认消费 MQ就是使用了消息超时 重传 确认机制来保证消息必达 场景 1 订单服务
  • RocketMQ学习笔记 - 顺序消息

    文章目录 1 定义 2 代码示例 2 1 消息实体 2 2 生产者 2 3 消费者 2 3 测试结果 1 定义 顺序消息 FIFO 消息 是 MQ 提供的一种严格按照顺序进行发布和消费的消息类型 顺序消息由两个部分组成 顺序发布和顺序消费
  • 13 SpringBoot整合RocketMQ实现过滤消息-根据SQL表达式过滤消息

    SQL表达式方式可以根据发送消息时输入的属性进行一些计算 RocketMQ的SQL表达式语法 只定义了一些基本的语法功能 数字比较 如 gt gt lt lt BETWEEN 字符比较 如 lt gt IN IS NULL or IS NO
  • 消息队列MQ-面试题

    目录 1 什么是消息队列 2 为什么要使用消息队列 1 解耦 2 异步处理 3 削峰 3 使用消息队列带来的一些问题 4 JMS两种消息模型 5 消息队列由哪些角色组成 6 常见消息中间件比较 7 如何保证消息队列是高可用的 RocketM
  • Docker快速安装RabbitMQ服务

    Docker快速安装RabbitMQ服务 快速开始 bin bash 建议保存为start sh脚本执行 docker run d hostname my rabbit name some rabbit restart always p 1
  • RabbitMQ的安装

    一 安装erlang环境 官网下载 http www erlang org downloads 这个文件其实不是gz格式的 使用file otp src 20 1 tar gz可以查看它的真实数据格式 解压 tar xvf otp src
  • RabbitMQ消息队列实战(1)—— RabbitMQ的体系

    RabbitMQ是一个开源的消息代理和队列服务器 用来在不同的应用之间共享数据 1983年 被认为是RabbitMQ的雏形的Teknekron创建 首次提出了消息总线的概念 中间经历过数个阶段的发展 一直到2004年 AMQP Advanc
  • Java 项目的跨库的方式查询的方法

    Java 项目的跨库的方式查询的方法 目录 概述 需求 设计思路 实现思路分析 性能参数测试 参考资料和推荐阅读 Survive by day and develop by night talk for import biz show yo
  • RocketMQ第四篇 Rocket集群配置

    在实际开发中一般都会使用docker安装rocketMQ docker安装rocketmq如下 docker安装配置rocketmq docker安装rocketmq docker pull foxiswho rocketmq server
  • RabbitMQ(四):RabbitMQ高级特性

    消息队列在使用过程中 面临着很多实际问题需要思考 消息可靠性问题 如何确保发送的消息至少被消费 次 延迟消息问题 如何实现消息的延迟投递 消息堆积问题 如何解决数百万消息堆积 无法及时消费的问题 高可用问题 如何避免单点的MQ故障而导致的不

随机推荐

  • php 从数据库读取数据并生成树型可折叠菜单

    数据存储形式 折叠菜单显示 直接调用 php页面即可输出树状可折叠菜单 所用到的js 区域折叠函数 function ShowMenu MenuID if MenuID style display 61 61 34 none 34 Menu
  • 提权apache 为root权限

    include lt stdio h gt include lt stdlib h gt include lt string h gt include lt sys types h gt include lt unistd h gt int
  • PHP 生成 WSDL 文件工具类 SoapDiscovery.class.php

    lt pre name 61 34 code 34 class 61 34 php 34 gt lt php Copyright c 2005 Braulio Jos Solano Rojas All rights reserved Red
  • Yii1.1 实现简单restful 框架

    学习了下php的rest服务 xff0c 将总结记录如下 采用Yii1 1版本 xff0c Yii2已经专门有restful专题 xff08 ps 暂时没有学习 xff09 1 先用Yii创建项目 2 创建数据库 xff08 rest xf
  • java 泛型

    什么是 泛型 xff1f 泛型 xff08 Generic type 或者 generics xff09 是对 Java 语言的类型系统的一种扩展 xff0c 以支持创建可以按类型进行参数化的类 可以把类型参数看作是使用参数化类型时指定的类
  • jsp学习(一)

    jsp java 服务器页面 作用 xff1a 将内容的生成和信息的展示相分离 运行在服务端 xff0c 本质上就是一个servlet xff0c 产生的java文件和class保留在tomcat的word目录下 jsp脚本 xff1a l
  • jsp学习(二)

    jsp注释 xff1a html注释 lt gt 注释的内容只在页面上看不到 xff0c Java代码和html源代码都有 java注释 只在java代码中存在 jsp注释 lt gt 只在jsp页面中存在 xff0c 翻译成java文件之
  • 数据结构 _ PAT练习 _ 1064 Complete Binary Search Tree

    1064 Complete Binary Search Tree 原题基本分析代码 原题 点此链接1 基本分析 参考陈越姥姥的解题2 xff0c 主要的难点在于在何处插入新元素使得满足完全搜索二叉树的条件 猜测还有一种更通用的动态插入算法
  • 数据结构 _ 基础练习 _ 7-10 公路村村通

    原题 点此链接1 题目分析 可参考课本 xff08 高等教育出版社 陈越 数据结构 xff09 P225中关于prim算法的描述解题 本题相对于课本描述的算法来说 xff0c 不需要考虑 父节点 xff08 parent xff09 xff
  • KEIL问题二[function的内容空没有显示(占用CPU过高)][报错Error: Encountered an improper argument]

    function的内容空没有显示 不知道怎么回事也没有任何复现的办法 装了各个版本的KEIL都不能够接解决这个问题 最终无意中新建立了一个代码分组彻底解决这个问题 KEIL Functions Bug 当出现 function的bug的时候
  • 数据结构 _ 基础练习 _7-11 关键活动 _ 非递归解法

    1 原题 点此链接1 2 解题思路 写在前面 xff0c 参考博文2 本题其实考察的就是课本 xff08 高等教育出版社 陈越 数据结构 xff09 6 8节 关键路径的内容 课本中给出了三个公式 xff0c 以分别计算三个要素 xff1a
  • 数据结构 _ PAT练习 _ 7-13 Insert or Merge

    原题 点此链接1 解题思路 参考课本 xff1a 高等教育出版社 陈越主编 数据结构 参考视频 xff1a MOOC 浙江大学 数据结构与算法 本题主要考察的是简单插入排序 xff08 课本P268 xff09 以及归并排序的非递归算法 x
  • 数据结构 _ 基础练习 _ 7-14 Insertion or Heap Sort

    原题 点此链接1 题目分析 与前一题 Insert or Merge 相同2 xff0c 同样考察的是插入排序算法以及堆排序算法 算法如下 xff1a 首先需要判断是插入排序还是堆排序 xff0c 由于插入必然是 有序序列 43 相同的序列
  • Matlab v_findpeaks代码

    这里写自定义目录标题 Matlab v findpeaks代码写在前面代码 Matlab v findpeaks代码 写在前面 本函数主要用于寻找数据的上下极值点 xff0c 可以用于求取包络 参考链接 xff1a http www ee
  • Android实现MP4边下边播(边缓存边播放、在线播放)原理与代码

    推荐一款全平台广告聚合SDK ADEasy https blog csdn net u013640004 article details 105416193 对于这套方法我已经封装成库 xff0c 可以直接下载使用 MP4Info1 0 2
  • 如何实现PCB走线开窗上锡

    特别说明 xff1a 电路中需要驱动8路继电器 xff0c 当多路继电器闭合导通时电流大增 xff0c 为保证实际效果 xff0c 在加宽电流线的同时 xff0c 希望去掉电流线上的阻焊层 绿油层 xff0c 板子做出来以后 xff0c 就
  • sqlite3无法使用方向键解决方法

    Question xff1a sqlite3打开数据库后无法使用方向键 xff0c 没有命令回滚功能 Answer xff1a 缺少插件形成 xff0c 解决办法是安装libreadline dev sudo apt get install
  • 关于笔记本linux亮度调节

    Laptop安装linux 系统后 xff0c 开机默认亮度是最大 xff0c 每次开机都很刺眼 xff0c 开机后调节好亮度后 xff0c 重启又恢复了 现在介绍可以永久设置屏幕亮度的方法 xff0c 这样就不用每次开机都设置亮度那么麻烦
  • LINUX下挂载exfat格式u盘或移动硬盘

    我的u盘本来是ntfs格式的 xff0c 本来在linux系统下可以读 xff0c 但由于我双系统 xff0c u盘经常在windows和linux中插来插去 xff0c 后来经常导致u盘在linux中无法挂载 xff0c 提示说未知文件系
  • C语言 消息队列

    消息队列 xff08 也叫做报文队列 xff09 能够克服早期unix通信机制的一些缺点 作为早期unix通信机制之一的信号能够传送的信息量有限 xff0c 后来虽然POSIX 1003 1b在信号的实时性方面作了拓广 xff0c 使得信号