linux 消息队列实例

linux下消息队列详解 消息队列提供了从一个进程向另外一个进程发送一块数据的方法,每个数据块认为有一个类型(通俗说法是一个通道),但是接受通道与发送通道必须一致才能实现通信。消息队列的不足之处在于每个消息最大长度有限度,每个消息队列总字节数有限制,系统的消息队列有限制。 命令: cat /proc/sys/kernel/msgmax :查看一条信息最大有多大 cat /proc/sys/kernel/msgmnb 阅读详情
/*
1.获取key:ftok()
2.获取消息实例:msgget()
3.收发消息:msgsnd(),msgrcv()
4.销毁消息实例:msgctl()

*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <memory.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

typedef struct{
    long type;
    char msg_buf[1024];
}msg_def;

int main(int argc, char** argv)
{
    key_t   key;
    int     msg_id = 0;
    size_t  snd_len = 0;
    int     res = 0;
    
    if (argc < 2)
    {
        printf("Usage: %s key\n", argv[0]);
        exit(-1);
    }
    
    key = ftok(argv[1], 0);
    msg_id = msgget(key, IPC_CREAT | 0777);
    if (msg_id < 0)
    {
        perror("msgget error");
        exit(-1);
    }
    
    printf("msg_id=%d\n", msg_id);
    msg_def msg;
    memset(&msg, 0x00, sizeof(msg_def));
    msg.type=1;
    memcpy(msg.msg_buf, "hello", sizeof(msg.msg_buf)-1);
    
    snd_len = sizeof(msg)-sizeof(long);
    res = msgsnd(msg_id, (const void*)&msg, snd_len, IPC_NOWAIT);
    if (res < 0)
    {
        perror("msgsnd error");
        exit(-2);
    }
    
    msg.type=2;
    memcpy(msg.msg_buf, "world", sizeof(msg.msg_buf)-1);
    res = msgsnd(msg_id, (const void*)&msg, snd_len, IPC_NOWAIT);
    if (res < 0)
    {
        perror("msgsnd error");
        exit(-2);
    }
    
    struct msqid_ds ds;
    res = msgctl(msg_id, IPC_STAT, &ds);
    if (res < 0)
    {
        perror("msgctl error");
    }
    printf("msg snd total is %d\n", ds.msg_qnum);
    return 0;
}

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

typedef struct{
    long type;
    char msg_buf[1024];
}msg_def;

int main(int argc, char** argv)
{
    key_t   key;
    int     msg_id = 0;
    size_t  rcv_len = 0;
    int     res = 0;
    long    type = 0;
    
    if (argc < 3)
    {
        printf("Usage: %s key type\n", argv[0]);
        exit(-1);
    }
    
    type = atoi(argv[2]);
    key = ftok(argv[1], 0);
    msg_id = msgget(key, IPC_CREAT | 0777);
    if (msg_id < 0)
    {
        perror("msgget error");
        exit(-1);
    }
    
    printf("msg_id=%d\n", msg_id);
    msg_def msg;
    memset(&msg, 0x00, sizeof(msg_def));

    rcv_len = sizeof(msg)-sizeof(long);
    res = msgrcv(msg_id, (void*)&msg, rcv_len, type, 0);
    if (res < 0)
    {
        perror("msgsnd error");
        exit(-2);
    }
    printf("type=%d, msg_buf=%s, msg_len=%d\n", msg.type, msg.msg_buf, rcv_len);
    

    struct msqid_ds ds;
    res = msgctl(msg_id, IPC_STAT, &ds);
    if (res < 0)
    {
        perror("msgctl error");
    }
    printf("msg snd total is %d\n", ds.msg_qnum);
    return 0;
}

运行:
1…/my_msg_snd /etc/passwd
msg_id=131072
msg snd total is 2
2.ipcs -q
------ Message Queues --------
key msqid owner perms used-bytes messages
0x00015beb 131072 zhangsan 777 2048 2
3…/my_msg_rcv /etc/passwd 1
msg_id=131072
type=1, msg_buf=hello, msg_len=1024
msg snd total is 1
4.ipcs -q

------ Message Queues --------
key msqid owner perms used-bytes messages
0x00015beb 131072 zhangyue 777 1024 1
5…/my_msg_rcv /etc/passwd 2
msg_id=131072
type=2, msg_buf=world, msg_len=1024
msg snd total is 0
可以通过命令删除消息队列:ipcrm -q 131072
代码删除:msgctl(msg_id, IPC_RMID, &ds);

linux 消息队列使用示例 linux消息队列进行通信的 简单示例代码 立即下载

相关推荐

linux c消息队列实现

本资源包含四个文件,一个makefile,一个头文件,一个发送端一个接收端。发送端读取指定的文件,并且按照环境变量中设置的消息队列键值进行发送。如果要改代码,只要把键值改一下,结构体储存要发送的消息的那个数组对应改成自己想发送的值,就可以很好的实现功能。接收端同样按环境变量设置的键值读取指定消息队列,接收消息。 两个程序都能在linux下 跑通,要编译 直接make就行。 只想要1积分,优快云不让我改。

Linux 消息队列及其代码示例

Linux 消息队列及其代码示例

qq_46017342的博客 1363

基于ROS与Gazebo的多机器人三角形编队仿真实践

本文详细介绍了基于ROS与Gazebo的多机器人三角形编队仿真实践,从环境搭建到编队控制的全过程。通过TurtleBot3机器人模型和TF坐标系系统,实现三个机器人的三角形编队控制,适用于机器人协同作业与编队算法研究。

weixin_29313817的博客 187

linux 消息队列的应用实例(代码)

msgid create /*********************************************************************** * 函数名 : msgIdCreate * 功能描述 : 此处执行两次是为了清空消息队列中的内容, 因为进程即使结束,消息队列中的数据仍然存在; * 输入参数 : 无 * 输出参数 : 无 * 返回值 : 无 */ #define SEND_MSG_KEY 1024 int msgIdCreate.

cao849861802的博客 842

CyberChef本地搭建

CyberChef本地搭建

2301_80241182的博客 6077

esp32-C3固件烧录用户手册

温馨提示:1.esp32-C3 BOOT脚为GPIO9,需要从芯片小板中焊接引出2.芯片小板中已经预留了所有烧录相关的引脚,大家可以按需焊接引线3.程序下载完,使用串口查看log时,需要使用220v供电使用(请务必准守用电安全)。原因:由于插座中包含继电器,计量计等耗电设备,所以usb转串口提供的3.3V电压和电流可能会出现供电不足,表现为usb转串口与电脑连接断断续续,导致无法查看log。

hbwang的博客 1万+

Linux内核编程 消息队列使用案例

Linux内核编程 消息队列使用案例

m0_56051805的博客 838

从传统业务到 AI Skill:产品经理也能看懂的能力改造指南(含完整案例)

从传统业务到 AI Skill:产品经理也能看懂的能力改造指南(含完整案例)

专注于编程、AI、人工智能等多个领域内容研究和分析 641

Linux进程通讯—消息队列

消息队列生产者是指产生消息并将消息发布到消息队列或主题中的应用程序。它负责构建或生成消息,这些消息可以是简单的文本、复杂的结构化数据或二进制数据,具体内容、格式和结构取决于应用程序的需求和消息中间件的设计。消息队列消费者(Message Consumer)是消息队列系统或消息中间件中的另一个关键角色,它负责从消息队列中取出(或订阅并接收)消息,并对这些消息进行进一步的处理。

weixin_45706195的博客 3222

Raspberry Pi 4B 蓝牙串口(SPP)配置与使用

Linux、Android、Windows 等操作系统带有在引导期间启动的蓝牙守护进程/蓝牙服务。 对于与监视器连接并使用 GUI(如 GTK 等)运行的设备,只需多次单击即可轻松启用并连接到附近的设备。 但是在无头设备的情况下,我们必须依赖于需要在命令行上运行的不同命令。 这篇博客我们将讨论如何在无头树莓派上通过蓝牙设备连接附近。

视觉与物联智能 2745

通信算法之283:大疆DJI云哨系统-DJI DroneID物理层协议-解速率匹配及Turbo译码

3. 完整云哨接收机,接收灵敏度。交流: 1279682290 ,2. Turbo译码模块。1. 解速率匹配模块。

leegang12的专栏 868

进程间通信:消息队列

消息队列是消息的链接表,存放在内核中并由消息队列标识符标识。创建一个新的消息队列或者打开一个已经存在的队列所使用的系统调用为msgget key:表示用户态所给出的key值(相当于文件名), flag:参数表示对该队列所拥有的权限。调用成功后会返回一个msgid(相当于文件描述符)。 Msgctl函数可以对消息队列执行多种操作,他和另外两个与信号量和共享内存有关的函数sem...

Mr_H9527的博客 411

【数字IC设计】芯片设计中的RDC

在芯片设计中,RDC是的缩写,类似于CDC(clock domain crossing),由于现在SOC芯片是有很多ECUs组成,为了使整个系统能够快速从复位中恢复, 用户希望SOC里面每个ECU模块都可以有自己独立的异步复位信号,这样可以在出问题的时候只复位有错误逻辑的模块,而使其它模块保持正常工作。

qq_40268672的博客 2185

Linux——消息队列

消息队列是一种用于在应用程序之间传递和存储数据的通信机制。它允许应用程序将消息发送到队列中,然后由另一个应用程序从队列中接收和处理这些消息。消息队列可以有效地实现异步通信、解耦应用程序之间的依赖关系,以及实现消息的持久化和顺序处理。常见的消息队列系统包括RabbitMQ、Kafka、ActiveMQ等。消息队列在现代分布式系统和微服务架构中被广泛应用。

m0_74774362的博客 1374

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

linux 消息队列

这本阿里P8撰写的算法笔记,再次推荐给大家,身边不少朋友学完这本书最后加入大厂: Github 疯传!史上最强悍!阿里大佬「LeetCode刷题手册」开放下载了! 消息队列,Unix的通信机制之一,可以理解为是一个存放消息(数据)容器。将消息写入消息队列,然后再从消息队列中取消息,一般来说是先进先出的顺序。可以解决两个进程的读写速度不同(处理数据速度不同),系统耦合等问题,而且消息队列里的消息哪怕进程崩溃了也不会消失。 最简单的消息内存的使用流程 ①ftok函数生成键值 ②msgget函数创建消息队列.

manongxianfeng的博客 5680

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Linux中消息队列

【代码】Linux中消息队列。

weixin_51034082的博客 838

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

linux 消息队列最大值,linux 消息队列的限制

消息队列的系统限制作者:冯老师,华清远见嵌入式学院讲师。消息队列是System V的IPC对象的一种,用于进程间通信,会受到系统的限制,本文主要描述了三个限制。第一:议个消息的最大长度;第二:消息队列的最大容量;第三:最大消息队列数。一、 一个消息的最大长度示例程序如下:#include #include #include #include #include #include #define...

weixin_31497453的博客 3943

Linux消息队列

通过上述步骤和示例代码,可以看出Linux系统中消息队列的使用方法。消息队列提供了一种灵活且高效的进程间通信方式,适用于需要异步通信的场景。

如无必要,勿增实体。 1383

linux消息队列编程实例

前言:    消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向其中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息 函数: 1.创建新消息队列或取得已存在消息队列 原型:int msgget(key_t key, int msgflg); 参数:      ke

志存高远 1303

linux消息队列

可以通过发送消息来避免命名管道的同步和阻塞问题。 管道 消息 流管道 先进先出 有边界 可以后进入、先出来 消息大小三大限制 一、什么是消息队列? 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。 消息队列与命名管道一样的不足,Linux用宏: MSGMAX来限制一条消息的最大长...

Hash 3120

linux 消息队列实例讲解

在做linux多任务编程的时候,难免会碰到要使用IPC技术了,但是很多人都对这些技术只知其名,不知道如何使用。为了大家都能很好的学习Linux,本人不才,贴出了自己写的 消息队列 编程,用的是多线程,不是多进程,原理一样。以后有时间会后续把其他几个技术一一详解,并贴上代码。好了,废话不多说,进入下面的实例讲解。 /*****************************************

ljclx1748的专栏 837

【Linux】——消息队列

1、消息队列概述 2、消息队列相关函数 3、实例

qq_43412060的博客 647

linux消息队列总结

1.消息队列简介 实现linux进程通信的方式有5种: --信号(Singal) --管道(Pipe) --消息队列(Message) --信号量(Semaphore) 每种进程通信方式实现方式和功能不一样,带来适用的场景也有所不同,消息队列是链表队列,它通过内核提供一个struct msqid_ds *msgque[MSGMNI]向量维护内核的一个消息队列列表,因此linux系统支持

stonecao的专栏 4万+

Linux下消息队列详解

Linux消息队列

威桑的博客 1644
上一篇: linux 多线程信号量(盘子水果问题)
下一篇: linux c mkdir遇到的坑
最后冰吻free
博客等级 码龄12年 121粉丝 371原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值