Linux下进程通信之消息队列

C++ Linux IPC进程通信-消息队列MQ 相比于共享内存和管道,消息队列能够实现指定的消息格式和排序,能实现更复杂的通信。MQ的复杂度较高,维护成本增加.如果MQ挂了,主服务直接挂了. 阅读详情

read date from message: msg_r.c

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>

#define BUFFSIZE 2050

struct my_msg
{
	long int l_msg_type;
	char sz_msg_text[BUFFSIZE];
};

int main(void)
{
	int n_run = 1;
	int n_msgid;
	struct my_msg st_msg;
	long int l_rec_type;
	
	n_msgid = msgget((key_t)1234,0666|IPC_CREAT);
	if(n_msgid==-1)
	{
		fprintf(stderr,"create msg failed: %s!\n",strerror(errno));
		exit(EXIT_FAILURE);
	}
	
	while(n_run)
	{
		if(msgrcv(n_msgid,(void*)&st_msg,BUFFSIZE,l_rec_type,0)==-1)
		{
			if(errno==EAGAIN)
			{
				printf("No data to read!\n");
				sleep(1);
			}
			else
			{
				fprintf(stderr,"receive data error: %s !\n",strerror(errno));
				exit(EXIT_FAILURE);
			}
		}
		printf("You Write data: %s",st_msg.sz_msg_text);
		if(strncmp(st_msg.sz_msg_text,"end",3)==0)
		{
			n_run=0;
		}
	}
	
	if(msgctl(n_msgid,IPC_RMID,0)==-1)
	{
			fprintf(stderr,",remove msg failed:%s\n",strerror(errno));
			exit(EXIT_FAILURE);
	}
		
	exit(EXIT_SUCCESS);
}

write data to messag: msg_w.c

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>

#define BUFFSIZE 1024
#define MAX_TEXT 2048

struct my_msg
{
	long int l_msg_type;
	char sz_msg_text[MAX_TEXT];
};

int main(void)
{
	int n_run = 1;
	int n_msgid;
	struct my_msg st_msg;
	long int l_rec_type;
	char sz_buff[BUFFSIZE];
	
	n_msgid = msgget((key_t)1234,0666|IPC_CREAT);
	if(n_msgid==-1)
	{
		fprintf(stderr,"create msg failed: %s!\n",strerror(errno));
		exit(EXIT_FAILURE);
	}
	
	while(n_run)
	{
		printf("please input data:");
		fgets(sz_buff,BUFFSIZE,stdin);
		st_msg.l_msg_type=1;
		strcpy(st_msg.sz_msg_text,sz_buff);
		//st_msg.sz_msg_text=sz_buff;
		if(msgsnd(n_msgid,(void*)&st_msg,MAX_TEXT,0)==-1)
		{
			fprintf(stderr,"send data error: %s!\n",strerror(errno));
			exit(EXIT_FAILURE);
		}
		
		if(strncmp(st_msg.sz_msg_text,"end",3)==0)
		{
			n_run=0;
		}
	}
	exit(EXIT_SUCCESS);
}

msgsnd与msgrec在接受和发送数据类型要注意,不然变异很容易出错

1.传送的类型

2.传送和接收的数据空间

Linux进程通信之消息队列的双向通信 上一篇博客我写了进程间通信基于管道的通信,但是管道的通信无疑有很大的缺点,最显著的就是只能单向通信,例如:server向client发消息,client无法回复;第二个就是只能在有血缘关系的进程间进行通信,虽然命名管道解决了第二点,但是第一点还是一个很大的问题。开个玩笑:微信如果只能单向通信的话,你还会用吗?我估计发个消息能难受死你。   所以,这就是接下来几种进程间通信的产生条件。消息队列、信号 阅读详情

相关推荐

linux c之通过消息队列实现进程通信

1、消息队列的介绍 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制,Linux用宏MSGMAX和MSGMNB来限制一条消息的最大长度和一个队列的最大长度。 2、消息队列需

码莎拉蒂 9842

进程通信之 消息队列

消息队列例程 Msgget建立消息队列,msgget(key,IPC_CREAT|0660);key键值 以及属性和权限 msgsnd(msgid,(void*)&msg_parent,sizeof(msg_parent)-sizeof(long),IPC_NOWAIT) 消息ID,消息地址,消息长度,以及阻塞设置等 msgrcv(msgid,(void*)&msg_child,size

hitliuyan的专栏 379

uds协议之can总线程序升级

uds协议简介 如何利用uds协议升级 升级流程 uds服务类型介绍

fangye945a的博客 1万+

嵌入式多路温湿度监控系统(四主控程序之进程间通信)

分别设置同网页程序、菜单程序通信的消息队列,以及查询消息队列更新相应数据 设置一块共享内存并进行映射 进程通信头文件sys_ipc.h #ifndef _TC9000_SYS_IPC_H #define _TC9000_SYS_IPC_H #include "config.h" //消息队列接收时索引值 #define TEMP_SMG_INDEX_BASE 10 #define WEB

cumtzdlxm的博客 513

云架构师进阶【SAP迁移方案设计】手把手教您玩转SAP上云

一,项目背景介绍 今天又接到了北京某制造企业SAP迁移的场景,先简单说明一下,好好的SAP在运行着为什么要做迁移这类大动作呢?众所周知SAP的ERP是企业的绝对核心系统,尤其对于制造业更是核心的系统,这样一套核心系统还是生产环境在迁移的过程中必然要面临比较大的挑战,如果有任何问题的话,都会对企业的绩效产生很大的影响。 经过跟客户沟通才得知,客户的SAP原来的系统是托管在运营商机房里,近期感染了勒索病毒,导致业务宕机,SAP应用服务器无法启动,仅有的数据库服务器可以运行。基于上述情况公司领导当机立断决定迅

bdsh818的博客 4222

Linux进程通信之消息队列

Linux进程通信之消息队列         消息队列就是一个消息的链表,我们可以把消息看作一个记录,具有特定的格式。消息队列也是进程中通信常见的方式之一,进程可以向消息队列中按照一定的规则添加新消息;另一些进程则可以从消息队列中读走消息。下面我们就来看看常见的消息队列函数: (1)   创建或打开一个消息队列 int msgget(key_t key , intflag); 消息队列的通

huaxiandao的博客 594

生态学家都在用的MixSIAR:用R语言搞定稳定同位素混合模型(从数据整理到结果解读)

本文详细介绍了生态学家常用的MixSIAR工具,通过R语言实现稳定同位素混合模型分析,从数据整理到结果解读全流程。文章涵盖环境准备、模型构建、参数设置、运行诊断及可视化等关键步骤,帮助研究者科学分析河口鱼类食物来源,适用于生态学研究和湿地保护政策制定。

weixin_28683065的博客 439

Linux 进程间通信之消息队列

说到消息队列,大家一定能想到android中的消息队列,有一个Looper不断的去消息队列中取消息的模型,Linux进程间通信的消息队列是在内存中建立一个消息队列(其实是一个链表),两个进程就可以通过发消息和收消息达到通信的目的 我们可以通过ipcs -q来查看当前系统中的消息队列 我们发现目前还没有消息队列1 msgget函数 该函数用来创建和访问一个消息队列。它的原型为:int msgge

swjtufq的博客 431

在Ubuntu 18下安装SIMULIA Abaqus 2020

参考资料: https://github.com/imirzov/Install-Abaqus-2019-on-Ubuntu-18.04-LTS 安装环境: Ubuntu 18.4 LTS 软件版本: SIMULIA for Linux 2020 1 准备 安装光盘及破解文件 解压光盘至一目录,不能挂载,因为要修改文件内容 /home/sunwk/Downloads/abaqus2020 更改文件权限为最大 sudo chmod -R 777 abaqus2020/ * 复制libpng12

oak619的博客 1万+

大模型量化技术全解析:从INT8到GPTQ/AWQ,降低部署成本实战指南

模型量化是一种通过降低神经网络权重和激活值的数据精度(如从FP16降至INT8/INT4),从而大幅减少模型内存占用和计算开销的核心模型压缩技术。其原理基于线性变换,将高精度浮点数映射到低精度整数表示,在硬件层面能利用专用低精度计算单元实现显著加速。这项技术的核心价值在于解决了大模型(如千亿参数LLM)部署时面临的高昂显存成本和推理延迟问题,使其能在消费级GPU和边缘设备上高效运行。当前,后训练量化(PTQ)因其无需重新训练的特性成为主流,衍生出GPTQ、AWQ、SmoothQuant等多种方法,广泛应用于

weixin_33804582的博客 633

Linux系统下-进程间通信(消息队列-详解)

Linux下,进程间通信方式: #(1)管道(Pipe)及有名管道(named pipe): #(2)信号量: #(3)共享内存: #(4)消息队列: #(5)套接口(Socket) #(6)信号(Signal):

逝去的浪花 3万+

【电源专题】案例:对比不同电池在不同电流下的电池放电曲线

无

一点硬件 2843

8 Linux系统中进程通信之消息队列

本篇要点: ①了解消息队列的特点,一个消息队列里有多个类型编号,可以存多组数据。 ②消息队列相关函数msgget、msgsnd、msgrecv和msgctl。 ③编写消息队列的基本使用的示例,还要利用消息队列在三进程间自由通信的进阶示例。

Ljt030608的博客 905

动态视频目标追踪系统:基于YOLOv11+DeepSORT的从入门到实战全流程指南

仅保留车辆类别(假设车辆类别ID为2)if det.class_index == 2: # 车辆类别ID通过本指南,你已完成从环境搭建数据准备模型训练到追踪系统与UI界面的全流程,搭建了一套完整的动态视频目标追踪系统。该系统在安防监控、交通管理等场景中具有实用价值,可实现目标的实时稳定追踪。未来,你可尝试结合多模态特征(如目标外观+运动特征)提升追踪鲁棒性,或探索轻量化模型部署(如TensorRT加速),让系统在边缘设备上也能高效运行。

LXY_LOVE36的博客 142

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【Linux学习笔记】进程通信之消息队列和信号量

本文介绍了Linux进程通信中的消息队列和信号量机制。消息队列允许进程间发送不同类型的数据块,具有随内核的生命周期特性。信号量主要用于同步和互斥,通过P/V操作保护临界资源,本质是资源预订机制。文章还阐述了并发编程概念如临界区、共享资源等,并分析了内核如何组织IPC资源。最后提供了一个在minishell中实现管道功能的代码示例,展示了进程间通信的实际应用。这些机制是Linux系统编程的重要基础,需要深入理解其原理和实现方式。

大白的编程日记. 1167

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Linux进程通信之POSIX消息队列

消息队列是Linux IPC中很常用的一种通信方式,它通常用来在不同进程间发送特定格式的消息数据。 消息队列和之前讨论过的16.1管道和FIFO有很大的区别,主要有以下两点: l 一个进程向消息队列写入消息之前,并不需要某个进程在该队列上等待该消息的到达,而管道和FIFO是相反的,进程向其中写消息时,管道和FIFO必需已经打开来读,否则写进程就会阻塞(默认情况下)。 l IPC的持续性不同。

anonymalias的专栏 2万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

linux进程通信---消息队列

linux进程通信---消息队列0.相关头文件1.函数原型、相关数据结构1.msgget():创建和访问一个消息队列2.msgsnd():发送信息,把一条消息添加到消息队列里去3.msgrcv():从一个消息队列里检索(接收)消息 0.相关头文件 #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> 1.函数原型、相关数据结构 描述:消息队列:IPC之一

Wmll1234567的博客 727

Linux 进程通信——消息队列与信号量

本文介绍了SystemV IPC机制中的消息队列和信号量。消息队列通过内核维护的队列实现进程间通信,使用key标识唯一性,支持msgget、msgctl、msgsnd和msgrcv等接口操作。信号量作为计数器用于资源管理,通过semget创建、semctl删除、semop进行PV操作。文章还分析了内核如何通过ipc_ids结构统一管理三种IPC资源(消息队列、信号量和共享内存),使用包含ipc_perm的柔性数组进行组织,并通过类型转换访问具体资源。两种机制都遵循SystemV标准,具有相似的接口设计和生命

2301_79976271的博客 751

【Linux修行路】进程通信——消息队列、信号量

二元信号量主要用于实现对临界资源的互斥访问。

m0_68662723的博客 1494

Linux进程通信(管道、消息队列、信号)

Linux进程通信 文章目录Linux进程通信概述一、管道1.1 pipe无名管道1.2 FIFO命名管道二、消息队列2.1 msgget创建/打开2.2 msgsnd发送2.3 msgrcv接收2.4 msgctl控制三、信号信号发送进程休眠/阻塞信号处理alarm闹钟/定时signal处理信号sigaction 概述 Linux系统给进程通信(IPC)提供了很多中方法,主要有以下这些: 管...

NameisBoy的博客 760

Linux操作系统 使用消息队列实现进程通信

消息队列是进程间通信(IPC)的一种方式,具有数据块类型区分和选择性接收的特点。系统提供了msgget()创建/获取队列,msgsnd()发送消息,msgrcv()接收消息,msgctl()控制队列等核心调用。相比管道,消息队列支持无关联进程通信,但容量有限;共享内存速度最快但需同步;信号量主要用于同步。消息队列适合小数据量传输,每个消息包含类型字段和用户定义的数据内容,接收方可按类型选择性读取。在调试多进程程序时,可使用set follow-fork-mode选择跟踪父或子进程。

2301_80140457的博客 494

linux进程通信———Posix消息队列简介及基础库函数

linux进程通信———Posix消息队列简介及基础库函数 引言:消息队列可认为是一个消息链表,有足够写权限的线程可向队列中放置消息,有足够读权限的线程可从队列中取走消息。本篇笔记将简要介绍Posix消息队列特性、基本库函数调用。 linux进程通信———Posix消息队列简介及基础库函数 一、Posix消息队列简介 1.1、与管道、FIFO差异 1.2、Posix消息队列与Syst...

邓博学习笔记 3099

Linux进程通信——消息队列

Linux进程通信——消息队列接收,发送的分别实现及夫妻进程发送消息的综合实现。了解函数流程及key值使用

嵌入式小白 记录学习过程 1558

linux 进程通信 - 消息队列

消息队列 消息队列亦称报文队列,也叫做信箱。是Linux的一种通信机制,这种通信机制传递的数据具有某种结构,而不是简单的字节流。 消息队列的本质其实是一个内核提供的链表,内核基于这个链表,实现了一个数据结构 向消息队列中写数据,实际上是向这个数据结构中插入一个新结点;从消息队列汇总读数据,实际上是从这个数据结构中删除一个结点 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 消息队列也有管道一样的不足,就是每个数据块的最大长度是有上限的,系统上全体队列的最大总长度也有一个上限 创建消息队列

weixin_43471255的博客 1604
上一篇: Linux下进程通信之共享内存
下一篇: 再谈sizeof——struct 结构存储空间的大小:与成员的顺序、#progma pack参数有关系
comwise
博客等级 码龄15年 58粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值