linux消息队列操作

TBOX(Telematics Box)在智能网联汽车中的核心功能与应用场景解析 TBOX(Telematics Box)是智能网联汽车的“中枢神经”,基于Android或Linux操作系统,并通过CAN总线与车辆深度交互。它实现了远程控制、车辆状态监控、OTA升级及紧急呼叫(E-CALL)等核心功能,是提升用车安全、便利性与实现车辆持续进化的关键技术组件。 阅读详情

对消息队列的操作无非有下面三种类型:

1、 打开或创建消息队列
消息队列的内核持续性要求每个消息队列都在系统范围内对应唯一的键值,所以,要获得一个消息队列的描述字,只需提供该消息队列的键值即可;

注:消息队列描述字是由在系统范围内唯一的键值生成的,而键值可以看作对应系统内的一条路经。

2、 读写操作

消息读写操作非常简单,对开发人员来说,每个消息都类似如下的数据结构:

struct msgbuf{
long mtype;
char mtext[1];
};

mtype成员代表消息类型,从消息队列中读取消息的一个重要依据就是消息的类型;mtext是消息内容,当然长度不一定为1。因此,对于发送消息来说,首先预置一个msgbuf缓冲区并写入消息类型和内容,调用相应的发送函数即可;对读取消息来说,首先分配这样一个msgbuf缓冲区,然后把消息读入该缓冲区即可。

3、 获得或设置消息队列属性:

消息队列的信息基本上都保存在消息队列头中,因此,可以分配一个类似于消息队列头的结构(struct msqid_ds,见附录 2),来返回消息队列的属性;同样可以设置该数据结构。



消息队列API

1、文件名到键值

#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok (char*pathname, char proj);


它返回与路径pathname相对应的一个键值。该函数不直接对消息队列操作,但在调用ipc(MSGGET,…)或msgget()来获得消息队列描述字前,往往要调用该函数。典型的调用代码是:

   key=ftok(path_ptr, 'a');
    ipc_id=ipc(MSGGET, (int)key, flags,0,NULL,0);
    …

2.系统V消息队列API
系统V消息队列API共有四个,使用时需要包括几个头文件:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>


1)int msgget(key_t key, int msgflg)

参数key是一个键值,由ftok获得;msgflg参数是一些标志位。该调用返回与健值key相对应的消息队列描述字。

在以下两种情况下,该调用将创建一个新的消息队列:

  • 如果没有消息队列与健值key相对应,并且msgflg中包含了IPC_CREAT标志位;
  • key参数为IPC_PRIVATE;


参数msgflg可以为以下:IPC_CREAT、IPC_EXCL、IPC_NOWAIT或三者的或结果。

调用返回:成功返回消息队列描述字,否则返回-1。

注:参数key设置成常数IPC_PRIVATE并不意味着其他进程不能访问该消息队列,只意味着即将创建新的消息队列。

2)int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg);
该系统调用从msgid代表的消息队列中读取一个消息,并把消息存储在msgp指向的msgbuf结构中。

msqid为消息队列描述字;消息返回后存储在msgp指向的地址,msgsz指定msgbuf的mtext成员的长度(即消息内容的长度),msgtyp为请求读取的消息类型;读消息标志msgflg可以为以下几个常值的或:

  • IPC_NOWAIT 如果没有满足条件的消息,调用立即返回,此时,errno=ENOMSG
  • IPC_EXCEPT 与msgtyp>0配合使用,返回队列中第一个类型不为msgtyp的消息
  • IPC_NOERROR 如果队列中满足条件的消息内容大于所请求的msgsz字节,则把该消息截断,截断部分将丢失。


msgrcv手册中详细给出了消息类型取不同值时(>0; <0; =0),调用将返回消息队列中的哪个消息。

msgrcv()解除阻塞的条件有三个:

  1. 消息队列中有了满足条件的消息;
  2. msqid代表的消息队列被删除;
  3. 调用msgrcv()的进程被信号中断;


调用返回:成功返回读出消息的实际字节数,否则返回-1。

3)int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg);
向msgid代表的消息队列发送一个消息,即将发送的消息存储在msgp指向的msgbuf结构中,消息的大小由msgze指定。

对发送消息来说,有意义的msgflg标志为IPC_NOWAIT,指明在消息队列没有足够空间容纳要发送的消息时,msgsnd是否等待。造成msgsnd()等待的条件有两种:

  • 当前消息的大小与当前消息队列中的字节数之和超过了消息队列的总容量;
  • 当前消息队列的消息数(单位"个")不小于消息队列的总容量(单位"字节数"),此时,虽然消息队列中的消息数目很多,但基本上都只有一个字节。


msgsnd()解除阻塞的条件有三个:

  1. 不满足上述两个条件,即消息队列中有容纳该消息的空间;
  2. msqid代表的消息队列被删除;
  3. 调用msgsnd()的进程被信号中断;


调用返回:成功返回0,否则返回-1。

4)int msgctl(int msqid, int cmd, struct msqid_ds *buf);
该系统调用对由msqid标识的消息队列执行cmd操作,共有三种cmd操作:IPC_STAT、IPC_SET 、IPC_RMID。

  1. IPC_STAT:该命令用来获取消息队列信息,返回的信息存贮在buf指向的msqid结构中;
  2. IPC_SET:该命令用来设置消息队列的属性,要设置的属性存储在buf指向的msqid结构中;可设置属性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes,同时,也影响msg_ctime成员。
  3. IPC_RMID:删除msqid标识的消息队列;


调用返回:成功返回0,否则返回-1。

----------------------------------------------------------------------------------------------------------------------

/*msgserver.c*/

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

#define   MSG_FILE "msgserver.c"
#define   BUFFER 255
#define   PERM S_IRUSR|S_IWUSR
/* 服务端创建的消息队列最后没有删除,我们要使用ipcrm命令来删除的 */
/* ipcrm -q <msqid> */

struct msgtype {
    long mtype;
    char buffer[BUFFER+1];
};

int main()
{
    struct msgtype msg;
    key_t key;
    int msgid;
   
    if((key=ftok(MSG_FILE,'a'))==-1)
    {
        fprintf(stderr,"Creat Key Error:%s/n", strerror(errno));
        exit(1);
    }

    if((msgid=msgget(key, PERM|IPC_CREAT|IPC_EXCL))==-1)
    {
        fprintf(stderr, "Creat Message Error:%s/n", strerror(errno));
        exit(1);
    }
    printf("msqid = %d/n", msgid);
    while(1)
    {
        msgrcv(msgid, &msg, sizeof(struct msgtype), 1, 0);
        fprintf(stderr,"Server Receive:%s/n", msg.buffer);
        msg.mtype = 2;
        msgsnd(msgid, &msg, sizeof(struct msgtype), 0);
    }
    exit(0);
}

/* msgclient.c */

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

#define   MSG_FILE "msgserver.c"
#define   BUFFER 255
#define   PERM S_IRUSR|S_IWUSR

struct msgtype {
    long mtype;
    char buffer[BUFFER+1];
};

int main(int argc, char **argv)
{
    struct msgtype msg;
    key_t key;
    int msgid;
   
    if(argc != 2)
    {
        fprintf(stderr,"Usage:%s string/n", argv[0]);
        exit(1);
    }
   
    if((key=ftok(MSG_FILE,'a'))==-1)
    {
        fprintf(stderr,"Creat Key Error:%s/n", strerror(errno));
        exit(1);
    }
   
    if((msgid=msgget(key, PERM))==-1)
    {
        fprintf(stderr,"Creat Message  Error:%s/n", strerror(errno));
        exit(1);
    }
   
    msg.mtype = 1;
    strncpy(msg.buffer, argv[1], BUFFER);
    msgsnd(msgid, &msg, sizeof(struct msgtype), 0); 
    memset(&msg, '/0', sizeof(struct msgtype));
    msgrcv(msgid, &msg, sizeof(struct msgtype), 2, 0);
    fprintf(stderr, "Client receive:%s/n", msg.buffer);
    exit(0);
}  

 
OpenWrt国内镜像源一键切换脚本:清华/阿里/中科大源全搞定 本文介绍了OpenWrt国内镜像源一键切换脚本,支持清华、阿里和中科大三大源,自动识别设备架构和系统版本,显著提升软件包安装速度和成功率。脚本包含架构自动识别、版本适配、多源选择和配置备份等功能,适用于x86_64、ramips/mt7621等常见架构,帮助用户解决海外源访问缓慢的问题。 阅读详情

相关推荐

手把手教你用GEM-2多频电磁仪找地下管道(附真实数据图)

本文详细解析了使用GEM-2多频电磁仪精准定位地下管线的全流程,包括设备调试、频率选择、现场扫描技巧及数据解读。通过真实案例展示了如何应对复杂干扰环境,提升管线检测效率与准确性,特别适合市政工程和地下管线普查。

weixin_42565652的博客 397

Netty 中channelRead 和 channelRead0 有什么区别?

channelRead 中调用了 channelRead0,其会先做消息类型检查,判断当前message 是否需要传递到下一个。最近做项目发现Netty中的channel有channelRead 方法也有channelRead0 方法,然后思考下这两个有什么区别呢?

刀林寻诗 1690

【2025最新】Multisim 14.3超详细安装步骤 【附安装包+永久+汉化】|Multisim 14.3

嗨,小伙伴们!是不是一直在找可靠的multisim下载安装教程?今天就给大家带来超详细的2025年Multisim 14.3安装全攻略!这款电路仿真神器绝对是学电子、做电路设计的必备工具!很多朋友后台留言说安装时各种报错、汉化失败,所以我决定出一期零基础、保姆级的教程,从下载到安装再到汉化,全部一步到位搞定!按照我的步骤来,包你顺利安装不出错!!!通过本教程,相信大家已经成功安装并配置好了Multisim 14.3。这款电路仿真神器能帮你设计和测试各种电路,从简单的LED闪烁到复杂的信号处理电路都不在话下。

pythonpapaxia的博客 8万+

msgsnd(msgqid,&msg,sizeof(int),0);解释一下参数

【代码】msgsnd(msgqid,&msg,sizeof(int),0);解释一下参数。

ihateright的博客 361

Device Mapper 代码分析

Device Mapper(DM)是Linux 2.6全面引入的块设备新构架,通过DM可以灵活地管理系统中所有的真实或虚拟的块设备。DM以块设备的形式注册到Linux内核中,凡是挂载(或者说“映射”)于DM结构下的块设备,不管他们是如何组织,如何通讯,在Linux看来都是一个完整的DM块设备。因此DM让不同组织形式的块设备或者块设备集群在Linux内核面前有一个完整统一的DM表示。一、DM

SonicLing的专栏 1万+

2025.05.30【转录组】|Ribo-seq数据流程详解(一 质量控制)

本文详细介绍了Ribo-seq数据的质控分析流程,重点讲解了使用fastp进行原始数据质控的关键步骤和参数设置。作者通过Snakemake自动化流程示例,展示了如何去除接头序列、过滤低质量reads、生成质控报告等操作。文章强调高质量的Ribo-seq数据对转录后调控和翻译动态研究的重要性,并提供了兼顾数据质量和下游分析需求的参数配置建议。该流程有助于研究人员规范高效地完成Ribo-seq数据质控,为后续分析提供可靠数据基础。

785

UNIX/LINUX编程学习之进程通信--消息队列

转自: http://shihaiyang.iteye.com/blog/483154 一、消息队列的基本概念      消息队列是一个存放在内核中的消息链表,每个消息队列由消息队列标识符标识。与管道不同的是消息队列存放在内核中,只有在内核重启(即操作系统重启)或者显示

906

ArcGIS Pro符号化教程

本文详细介绍了ArcGIS Pro的软件设置和符号化操作步骤。主要包括:1)设置默认工程目录和关闭地图自动加载;2)创建新工程的基本流程;3)点要素的单一符号化方法,包括样式修改和图层调整;4)图表符号显示过滤器的使用,涉及字段添加、图表类型选择和背景设置。文章还提供了操作截图和数据下载链接,适合GIS初学者学习ArcGIS Pro的基础符号化操作。

WwLK123的博客 549

关于linux中消息队列的使用

以前对于linux消息队列有过大概的了解,在《uinx高级系统编程》这本书里面提到过。但是具体使用不是很了解,最近再熟悉appserver和tws的框架,这里面使用了linux的消息队列,于是乎进行了系统的了解。消息队列如下 int msgget(key_t key, int msgflg); int msgctl(int msqid, int cmd, struct msqid_ds *buf

tongdajiu的专栏 3710

Mac电脑安装burp suite2024版本记录

下载最新版本burpsuitloader-XXX-all.jar,改名为burpsuitloader.jar。目录下,修改vmoptions.txt文件,新增以下内容,如果keygen不是这个名称的话,需要修改。,点击license左侧的copy复制它,然后手动从启动台启动burpsuite。,复制如下命令到终端即可(要加双引号,不然目录中空格会导致命令截断)再复制激活响应信息到burpsuite中即可激活。后续运行burp直接从启动台运行即可。将如下框的信息复制到激活器中。输入后下一步,点击手动激活。

墨痕诉清风的博客 902

UCIE Specification详解(二)

UCIe架构概述。

Crazzy_M的博客 3297

linux消息队列最大空间,linux消息队列解析

基本概念1.队列队列是信息的线性表,它的访问次序是先进先出(FIFO)。也就是说,置入队列中的第一个数据项将是从队列中第一次读出的数据项,置入的第二项将是读出的第二项,依此类推。这是队列允许的唯一存取操作,其它随机访问是不允许的。这种数据结构保证对数据资源的请求将严格按照先后顺序进行,因而可用于对事件的调度并起到I/O缓冲的作用。2.报文发送进程和接收进程进行信息的交换,一般是通过将信息划分为若干...

weixin_32495691的博客 563

YOLO26涨点改进 | 独家创新、损失函数改进篇 | TGRS 2025顶刊 | 带来AIoU小目标涨点损失函数,增强了目标检测中对边界框形状和尺寸的敏感度,适合复杂场景和小物体检测中有效涨点

AIoU损失函数通过自适应形状感知和尺寸敏感加权机制,有效解决了YOLO26原生损失函数在小目标检测中的缺陷。实验结果表明,AIoU损失函数在多个数据集上均取得了显著的性能提升,尤其在小目标检测和多任务场景下表现突出。自适应形状感知,对形状差异较大的目标给予更大惩罚,提高边界框拟合精度尺寸敏感加权,对小目标的宽高比例差异给予更大权重,增强模型对小目标特征的学习能力梯度连续性好,即使在IoU=0时仍能提供有效的梯度更新,解决小目标梯度消失问题。

qq_36130719的博客 159

linux 消息对lie_linux消息队列操作

对消息队列的操作无非有以下三种类型:1、 打开或创建消息队列消息队列的内核持续性要求每一个消息队列都在系统范围内相应唯一的键值,所以,要获得一个消息队列的描写叙述字,仅仅需提供该消息队列的键值就可以;注:消息队列描写叙述字是由在系统范围内唯一的键值生成的,而键值能够看作相应系统内的一条路经。2、 读写操作消息读写操作很easy,对开发者来说,每一个消息都相似例如以下的数据结构:struct msg...

weixin_39714763的博客 96

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

【LINUX操作系统】浅显认识消息队列与信号量

完成了System V中对共享内存的学习之后,我们浅显认识一下消息队列与信号量。

2301_79501467的博客 807

jre9下载 jdk9

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

php 操作linux 消息队列

关于Linux系统进程通信的概念及实现可查看:http://www.ibm.com/developerworks/cn/linux/l-ipc/   关于Linux系统消息队列的概念及实现可查看:http://www.ibm.com/developerworks/cn/linux/l-ipc/part4/   PHP的sysvmsg模块是对Linux系统支持的System V IPC中的Syste...

weixin_34198583的博客 226

Linux消息队列操作

对消息队列的操作无非有下面三种类型: 1、 打开或创建消息队列 消息队列的内核持续性要求每个消息队列都在系统范围内对应唯一的键值,所以,要获得一个消息队列的描述字,只需提供该消息队列的键值即可; 注:消息队列描述字是由在系统范围内唯一的键值生成的,而键值可以看作对应系统内的一条路经。 2、 读写操作 消息读写操作非常简单,对开发人员来说,每个消息都类似如下的数据 结构:

522
上一篇: 链接libmysqlclient错误(undefined reference to `uncompress')
下一篇: 在php中配置使用smarty模板引擎
zhsp1029
博客等级 码龄21年 115粉丝 89原创
评论 14
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值