Linux下消息队列详解

在Linux下,消息队列(Message Queues)是进程间通信(IPC)的一种重要机制,它允许进程以异步的方式进行数据交换。消息队列通过内核来存储消息,当一个进程发送消息时,消息将被放入队列中,另一个进程则可以从队列中取出消息。相比于管道,消息队列支持有序、带类型的消息传递,并且不会像管道一样覆盖之前的消息。

消息队列的特点

  • 异步通信:消息队列提供进程之间的异步通信,一个进程可以将消息发送到队列中而不需要等待接收进程。
  • 消息类型:每个消息都带有一个类型,接收进程可以根据消息类型选择性地接收消息。
  • 有序性:消息队列按照FIFO的顺序存储消息,即先发送的消息会先被接收,除非明确指定接收某种类型的消息。
  • 持久性:消息队列存储在内核中,并且在消息队列被显式删除之前,队列中的消息可以持久存在,跨越多个进程的生命周期。

常用的消息队列相关函数

  1. msgget
    msgget用于创建新的消息队列或获取一个现有的消息队列标识符(ID)。它的原型如下:

    int msgget(key_t key, int msgflg);

    • key:消息队列的键值,可通过ftok生成。
    • msgflg:控制消息队列的创建行为。常用的标志位包括:
      • IPC_CREAT:如果消息队列不存在,则创建一个新队列。
      • IPC_EXCL:与IPC_CREAT一起使用时,如果队列已存在则返回错误。

    示例

    int msgid = msgget(IPC_PRIVATE, IPC_CREAT | 0666); if (msgid == -1) { perror("msgget failed"); }

  2. msgsnd
    msgsnd函数用于向消息队列发送消息。它的原型如下:

    int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

    • msqid:消息队列的ID。
    • msgp:指向消息的指针,消息通常需要包含消息类型。
    • msgsz:消息数据的大小(不包括类型部分)。
    • msgflg:控制发送行为。常用的标志位包括:
      • IPC_NOWAIT:如果消息队列已满,函数立即返回而不是阻塞。

    示例

    struct msgbuf {long mtype; // 消息类型char mtext[100]; // 消息内容
    };struct msgbuf msg;
    msg.mtype = 1; // 设置消息类型
    strcpy(msg.mtext, "Hello, World!");if (msgsnd(msgid, &msg, sizeof(msg.mtext), 0) == -1) {perror("msgsnd failed");
    }
    

  3. msgrcv
    msgrcv函数用于从消息队列接收消息。它的原型如下:

    ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

    • msgtyp:指定接收的消息类型。如果msgtyp为0,接收队列中的第一个消息;如果msgtyp为正,接收指定类型的消息。
    • msgflg:控制接收行为,IPC_NOWAIT表示如果没有可用消息则立即返回。

    示例

    if (msgrcv(msgid, &msg, sizeof(msg.mtext), 1, 0) == -1)
    { perror("msgrcv failed"); 
    } else { printf("Received message: %s\n", msg.mtext);
    }
  4. msgctl
    msgctl函数用于控制消息队列,比如删除队列、获取队列信息等。它的原型如下:

    int msgctl(int msqid, int cmd, struct msqid_ds *buf);

    • cmd:控制命令,常用的有:
    • IPC_RMID:删除消息队列。IPC_STAT:获取消息队列的状态信息。IPC_SET:设置消息队列的属性。buf:用于保存或设置消息队列的状态信息。

    示例

    if (msgctl(msgid, IPC_RMID, NULL) == -1) { perror("msgctl failed"); }

错误处理

在使用消息队列相关函数时,经常会遇到一些典型的错误码,如:

EACCES:权限不足,无法访问消息队列。 EEXIST:当使用IPC_EXCL标志时,队列已存在。 ENOENT:当没有IPC_CREAT标志时,队列不存在。 ENOMSG:没有匹配类型的消息可接收。

使用示例

下面是一个简单的消息队列示例,展示了如何在两个进程之间进行消息发送与接收:

发送进程

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>struct msgbuf {long mtype;char mtext[100];
};int main() {key_t key = ftok("progfile", 65);int msgid = msgget(key, 0666 | IPC_CREAT);struct msgbuf msg;msg.mtype = 1;strcpy(msg.mtext, "Hello from sender!");msgsnd(msgid, &msg, sizeof(msg.mtext), 0);printf("Message sent: %s\n", msg.mtext);return 0;
}

接收进程

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>struct msgbuf {long mtype;char mtext[100];
};int main() {key_t key = ftok("progfile", 65);int msgid = msgget(key, 0666 | IPC_CREAT);struct msgbuf msg;msgrcv(msgid, &msg, sizeof(msg.mtext), 1, 0);printf("Message received: %s\n", msg.mtext);msgctl(msgid, IPC_RMID, NULL); // 删除消息队列return 0;
}

关键标志和选项

  • IPC_CREAT:如果消息队列不存在,创建新队列。
  • IPC_EXCL:和IPC_CREAT一起使用时,如果消息队列已存在,返回错误。
  • IPC_RMID:删除消息队列。

总结

消息队列是Linux下进程间通信的重要工具,适用于异步、有序和带类型的数据传递。通过使用msggetmsgsndmsgrcvmsgctl等函数,开发者可以方便地在不同进程之间交换数据。使用时需要特别注意权限、错误处理,以及在适当的时候删除消息队列,以避免资源泄漏。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

01——springboot2基础知识

一、springboot的快速入门 springboot的作用&#xff1a;用来简化Spring应用的初始搭建以及开发过程 一、idea创建springboot工程——运行的步骤 选择Spring Initializr进行创建&#xff08;现在基本上没有jdk1.8选了&#xff0c;都是jdk17了&#xff0c;需要的话&#xff0c…

拼多多m 端详情 滑块 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我删…

脚本注入网页:XSS

跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;简称 XSS&#xff09;是一种常见的网络安全漏洞。它是指攻击者在网页中注入恶意脚本代码&#xff0c;当用户访问该网页时&#xff0c;恶意脚本会在用户的浏览器中执行&#xff0c;从而导致一系列安全问题。这些问题可…

matlab处理语音信号

matlab有处理语音信号的函数wavread&#xff0c;不过已经过时了&#xff0c;现在处理语音信号的函数名称是audioread选取4.wav进行处理&#xff08;只有4的通道数为1&#xff09; 利用hamming窗设计滤波器 Ham.m function [N,h,H,w] Ham(fp,fs,fc)wp 2*pi*fp/fc;ws 2*pi*…

使用eBPF进行半虚拟化调度\动态vcpu优先级管理

使用eBPF进行半虚拟化调度\动态vcpu优先级管理 动机 双重调度&#xff1a; 主机&#xff08;Host&#xff09;调度虚拟CPU&#xff08;vcpu&#xff09;线程。客户机&#xff08;Guest&#xff09;调度在客户机内部运行的任务。 调度器之间的无知&#xff1a; 主机在调度vcpu…

【经验分享】电商api接口——各类商品数据一键获取

目前&#xff0c;双十一促销活动正在火爆预热进行中。大促期间&#xff0c;消费者常常会做攻略以防被坑&#xff0c;而活动期间&#xff0c;品牌商家方也需要有所行动&#xff0c;避免一些不必要的损失。 大促期间&#xff0c;商家前前后后的改价活动往往比较频繁&#xff0c;…

APP自动化中 ADB Monkey用法

一、monkey是干什么的&#xff1f; 我们可以使用monkey做手机端性能的压力测试&#xff0c;稳定性测试 二、monkey在使用的时候&#xff0c;他的运行特性 monkey默认配置下执行&#xff0c;会在手机中随机的点击或者轻触我们的手机中应用&#xff0c;不过这个时候&#xff0…

音频3A——初步了解音频3A

文章目录 前言一、3A使用的场景和原理1.AEC2.AGC3.ANS/ANR4.硬件3A和软件3A的区别1&#xff09;层级不同2&#xff09;处理顺序不同3&#xff09;优缺点 5.处理过程 二、3A带来的问题三、开源3A算法总结 前言 在日常的音视频通话过程中&#xff0c;说话的双端往往会面对比较复…

2. 程序结构

在本章中&#xff0c;我们将开始做一些真正称得上编程的事情。我们将扩展对 JavaScript 语言的掌握&#xff0c;不再局限于目前所见的名词和句子片段&#xff0c;而是能够表达有意义的散文。 表达式和语句 在第 1 章中&#xff0c;我们创建了值&#xff0c;并应用运算符来获取…

CSS的背景属性

background-colcor属性 设置背景颜色 width: 200px;height: 200px;background-color: aqua; background-image属性 设置元素的背景图像 元素的背景是元素的总大小&#xff0c;包括填充和边界&#xff08;不包括外边距&#xff09;默认情况下background-image属性放置在元素的…

Seata学习笔记

目录 Seata的三大角色 角色 相关流程 相关事务模式 AT 模式&#xff08;默认模式&#xff09; 概述 整体机制 分析 XA 模式 概述 机制 分析 TCC 模式 概述 机制 分析 SAGA 模式 概述 机制 分析 参考&#xff1a; Seata的三大角色 角色 TC (Transaction Co…

STC89C52定时器与中断 详细介绍 0基础入门

STC89C52定时器与中断 前言定时器/计数器定时器/计数器 功能选择定时器/计数器 模式选择使用寄存器进行功能选择与模式选择 中断使用寄存器进行中断配置中断执行操作 总结完整程序 前言 对于定时器与中断&#xff0c;这是两个完全不同的概念&#xff0c;在单片机中它们也对应着…

C++的哲学思想

C的哲学思想 文章目录 C的哲学思想&#x1f4a1;前言&#x1f4a1;C的哲学思想☁️C底层不应该基于任何其他语言&#xff08;汇编语言除外&#xff09;☁️只为使用的东西付费&#xff08;不需要为没有使用到的语言特性付费&#xff09;☁️以低成本提供高级抽象&#xff08;更…

WebAssembly进阶,vue3 使用 WebAssembly,及 WebAssembly vs JavaScript 的性能对比

目录 核心使用步骤 .c文件.cpp文件编译 使用 Emscripten 转译文件 页面中引入.wasm文件中的函数 WebAssembly vs JavaScript 的性能对比 性能对比关键点: 具体场景 实际案例分析 如果对WebAssembly不熟悉可以前往:WebAssembly最详教程,进行WebAssembly基础学习 Web…

【有啥问啥】Stackelberg博弈方法:概念、原理及其在AI中的应用

Stackelberg博弈方法&#xff1a;概念、原理及其在AI中的应用 1. 什么是Stackelberg博弈&#xff1f; Stackelberg博弈&#xff08;Stackelberg Competition&#xff09;是一种不对称的领导者-追随者&#xff08;Leader-Follower&#xff09;博弈模型&#xff0c;由德国经济学…

【LVIO-SLAM】 激光slam理论与实践

【LVIO-SLAM】 激光slam理论与实践 1. 激光slam理论与实践1.1 2D激光SLAM1.2 3D激光SLAM 2. 激光雷达运动畸变去除2.1 Lidar数学模型与点云去畸变2.2 运动畸变 3. 激光slam的前端配准3.1 帧间匹配3.2 3.2 ICP (Iterative Closest Point)3.3 PI-ICP (Point-to-Line Iterative Cl…

ubuntu22 解决docker无法下载镜像问题

参考在 Ubuntu 中安装 Docker_ubuntu安装docker-CSDN博客 安装docker完成后&#xff0c;运行如下命令验证 Docker 服务是否在运行&#xff1a; systemctl status docker 运行&#xff08;sudo docker run hello-world&#xff09;例子报错&#xff1a; 问题&#xff1a;Docker…

Vue 内存泄漏分析:如何避免开发过程中导致的内存泄漏问题

一. 引言 Vue 作为一款流行的前端框架&#xff0c;已经在许多项目中得到广泛应用。然而&#xff0c;随着我们在 Vue 中构建更大规模的应用程序&#xff0c;我们可能会遇到一个严重的问题&#xff0c;那就是内存泄漏。内存泄漏是指应用程序在使用内存资源时未正确释放&#xff…

iPhone 16 还剩一个月,微软开源新技术让手机以 6 倍速度提前跑上大模型

作者 | 微软亚洲研究院 责编 | 王启隆 出品 | AI 科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09; 随着人工智能技术的飞速发展&#xff0c;将大语言模型(LLMs)部署到边缘设备上已成为当前 AI 领域的一个热门趋势。这一趋势不仅体现在微软 Windows 11 AI PC 等产品…

【Qualcomm】高通SNPE框架简介、下载与使用

说明&#xff1a;基础内容&#xff01;不建议订阅&#xff01;不建议订阅&#xff01;不建议订阅&#xff01; 目录 一 高通SNPE框架 1 SNPE简介 2 QNN与SNPE 3 Capabilities 4 工作流程 二 SNPE的安装与使用 1 下载 2 Setup 3 SNPE的使用概述 一 高通SNPE框架 1 SNP…