【Linux应用】进程间通信消息队列

news2025/7/26 8:23:15

1.前言

进程间通信简称IPC(Inter process communication),进程间通信就是在不同进程之间传播或交换信息。
在这里插入图片描述

消息队列是进程通信的一种方式,本质是一个存储消息的链表,这些消息具有特定的格式及特定优先级。消息队列是随内核持续的,只有在内核重启,或者删除一个消息队列时,该消息队列才会真正地被删除。

2.API函数

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

消息队列的内核持续性要求每个消息队列都要在系统范围内有对应的唯一键值,可以使用ftok获取键值。

   int msgget(key_t key ,int msgflg );创建或打开消息队列

与其他的IPC机制一样,程序必须提供一个键来命名某个特定的消息队列。msgflg是一个权限标志,表示消息队列的访问权限,它与文件的访问权限一样。msgflg可以与IPC_CREAT做或操作,表示当key所命名的消息队列不存在时创建一个消息队列,如果key所命名的消息队列存在时,IPC_CREAT标志会被忽略,而只返回一个标识符。IPC_EXCL和IPC_CREAT一起使用,如果对应键值的消息队列已经存在,则出错,返回-1。msgflg: IPC_CREAT|0666 如果不存在则创建。并且给权限

int msgsend(int msgid, const void *msg_ptr, size_t msg_sz, int msgflg);

msg_ptr是一个指向准备发送消息的指针,但是消息的数据结构却有一定的要求,指针msg_ptr所指向的消息结构一定要是以一个长整型成员变量开始的结构体,接收函数将用这个成员来确定消息的类型。所以消息结构要定义成这样:

struct my_message {
    long int message_type;
    /* The data you wish to transfer */
};
int msgrcv(int msgid, void *msg_ptr, size_t msg_st, long int msgtype, int msgflg);

msgid, msg_ptr, msg_st 的作用也函数msgsnd()函数的一样。

msgtype 可以实现一种简单的接收优先级。如果msgtype为0,就获取队列中的第一个消息。如果它的值大于零,将获取具有相同消息类型的第一个信息。如果它小于零,就获取类型等于或小于msgtype的绝对值的第一个消息。

msgflg 用于控制当队列中没有相应类型的消息可以接收时将发生的事情。

3.示例

send:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/msg.h>
#include <errno.h>
 
#define MAX_TEXT 512
 
struct msg_st
{
    long int msg_type;
    char text[MAX_TEXT];
};
 
int main(int argc, char **argv)
{
    struct msg_st data;
    char   buffer[BUFSIZ];//8192
    int    msgid = -1;
    key_t  key;
 
    key = ftok(".", 'z');    //   路径          id号
    if(key == -1)
    {
        printf("ftok error\n");
    }
    printf("key:%x\n",key);
 
    // 建立消息队列
    msgid = msgget(key, IPC_CREAT | 0666);
    if (msgid == -1)
    {
        fprintf(stderr, "msgget failed width error: %d\n", errno);
        goto fail;
    }
 
    // 向消息队里中写消息,直到写入end
    while (1)
    {
        printf("Enter some text: \n");
        fgets(buffer, BUFSIZ, stdin);
        data.msg_type = 1; // 注意2
        strcpy(data.text, buffer);
 
        // 向队列里发送数据
        if (msgsnd(msgid, (void *)&data, MAX_TEXT, 0) == -1)
        {
            fprintf(stderr, "msgsnd failed\n");
            exit(EXIT_FAILURE);
        }
 
        // 输入end结束输入
        if (strncmp(buffer, "end", 3) == 0)
        {
            break;
        }
 
        sleep(1);
    }
fail:
    exit(EXIT_SUCCESS);
}

receive

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/msg.h>
#include <errno.h>
 
struct msg_st
{
    long int msg_type;
    char text[BUFSIZ];
};
 
int main(int argc, char **argv)
{
    int      msgid = -1;
    struct   msg_st data;
    long int msgtype = 0;
    key_t    key;
 
    key = ftok(".", 'z');    //   路径          id号
    if(key == -1)
    {
        printf("ftok error\n");
    }
    printf("key:%x\n",key);
 
    // 建立消息队列
    msgid = msgget(key, IPC_CREAT|0666);
    if (msgid == -1)
    {
        fprintf(stderr, "msgget failed width error: %d\n", errno);
        goto fail;
    }
 
    // 从队列中获取消息,直到遇到end消息为止
    while (1)
    {
        if (msgrcv(msgid, (void *)&data, BUFSIZ, msgtype, 0) == -1)
        {
            fprintf(stderr, "msgrcv failed width erro: %d", errno);
        }
 
        printf("You wrote: %s\n", data.text);
 
        // 遇到end结束
        if (strncmp(data.text, "end", 3) == 0)
        {
            break;
        }
    }
 
fail:
 
    exit(EXIT_SUCCESS);
}

参与讨论

==================================
新的文章内容和分享已更新在:

|工|·-·|重|·-·|号|:协议森林

==============================

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

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

相关文章

新建一个虚拟环境来管理自己的pytorch环境

python只是一个编程语言&#xff0c;在开发具体软件时&#xff0c;可能还需要使用到各种的包&#xff0c;比如著名的 numpy&#xff0c;torch 等等。如果我们自己来管理则显得非常麻烦&#xff0c;于是便有了Anaconda这样一个类似容器的东西&#xff0c;它封装了python各种各样…

Spring Cloud入门篇 Hello World | Spring Cloud 1

一、专栏说明 Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如:服务发现/注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。 本文主要介绍Spring C…

功能测试三年,是应该改变了

前言 测试行业3年多经验&#xff0c;学历大专自考本科&#xff0c;主要测试方向web&#xff0c;PC端&#xff0c;wap站&#xff0c;小程序公众号都测试过&#xff0c;app也测过一些&#xff0c;C端B端都有&#xff0c;除功能外&#xff0c;接口性能也有涉猎&#xff0c;但是不…

JavaScript 两种方案打开文件对话框

JavaScript 两种方案打开文件对话框 文章目录JavaScript 两种方案打开文件对话框一、文件对话框二、传统方案表单元素&#x1f308;三、文件系统访问API&#x1f4a6;四、更进一步使用六、代码仓库&#x1f310;七、参考资料&#x1f498;七、推荐博文&#x1f357;一、文件对话…

ZYNQ双核处理器独立运行AMP

一、简介多核处理器从多核的结构上是否一致&#xff0c;分为两种基本架构&#xff1a;同构多核架构和异构多核架构。同构多核处理器是指系统中的处理器在结构上是相同的&#xff1b;而异构处理器是指系统中的处理器在结构上是不同的&#xff0c;这些处理器可以是通用处理器&…

MySQL递归查询 三种实现方式

1 建表脚本1.1 建表DROP TABLE IF EXISTS sys_region; CREATE TABLE sys_region (id int(50) NOT NULL AUTO_INCREMENT COMMENT 地区主键编号,name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 地区名称,short_name varchar(50) CHARA…

WebDAV之π-Disk派盘+Cloud Player

Cloud Player 支持WebDAV方式连接π-Disk派盘。 推荐一款云媒体播放器是存储在常见云平台中的内容的通用播放器。 Cloud Player云媒体播放器是存储在常见云平台中的内容的通用播放器,无需将其下载到设备。支持以下云平台:Google Drive、DropBox、One Drive、WebDav等。此外,…

BI解析,告诉你企业为什么选择商业智能BI?

数据的价值目前在商业世界和现代化城市建设中尤为突出&#xff0c;先说商业世界&#xff0c;数据在这里成为了各领域企业的重要资产&#xff0c;不仅让众多企业重新构建了以数据为企业文化、核心驱动力的数据体系&#xff0c;还把企业的财务、销售、运营、市场、研发等不同部门…

写出高质量的前端代码之消除代码中的重复

软件开发中&#xff0c;有个很重要的DRY原则&#xff0c;即Dont Repeat Yourself&#xff0c;也就是不要重复自己。 重复的代码会带来以下问题&#xff1a; 开发效率低&#xff0c;重复造轮子不同人开发的同一类功能&#xff0c;质量层次不齐修改问题时可能会遗漏&#xff0c…

vue3 + vite + ts 集成mars3d

vue3 vite ts 集成mars3d 文章目录vue3 vite ts 集成mars3d前言一、创建一个vue3 vite ts项目二、引入mars3d相关依赖三、vite.config.ts 相关配置四、 新建DIV容器 创建地图前言 使用mars3d过程中&#xff0c;需要集成mars3d到自己的项目中&#xff0c;mars3d开发教程…

MFC实现曲柄滑块以及铰链四杆机构的运动仿真

创建MFC应用&#xff0c;选择单文档&#xff0c;在应用程序类型中的应用程序类型选择单文档&#xff0c;在项目样式中选择MFC standard&#xff0c;在用户界面功能中的命令行中选择 使用菜单栏和工具栏。这样选择界面更好看一点&#xff0c;下面给出截图&#xff1a;在资源视图…

代码随想录算法训练营第三十八天 | 理论基础 ,509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯

Day36 周日休息~一、参考资料理论基础https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 刷题大纲递推五部曲&#xff1a;确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确…

云计算专业和计算机专业哪个好就业?

云计算专业其实也是属于计算机类专业呢&#xff0c;他包括了计算机硬件设备、计算机网络、磁盘柜、操作系统、中间件、数据库、服务器/虚拟机、应用软件开发等技术内容&#xff0c;云计算技术是以IT服务的形式面向用户的&#xff1b;所以云计算不是一门技术&#xff0c;而是众多…

一个底层30岁的测试员的故事,连躺平都是奢望的....

背景 我是一个生活在某二线城市的测试员&#xff0c;家里面有两位小朋友&#xff0c;老大现在读幼小衔接&#xff0c;明年上小学&#xff0c;老二两岁多一点点&#xff0c;明年上幼儿园。家庭主要开支有房贷、车贷、车位贷、保险、时不时小意外、还有一笔 3万的信用卡分期&…

【亲测】PHP进销存源码 ERP多仓库管理系统 网络版手机端+小程序版进销存 二次开发

可电脑端操作&#xff0c;也可以小程序端操作&#xff0c;非常方便&#xff01;适合小型企业个人使用。 服务端thinkphp5全套开源源码&#xff0c;uniapp前端全套开源 功能 1、支持采购单录入、审核、入库、退货等采购过程中的记录追踪 2、支持销售、出库、销售审核、出库审核…

Smtplib之发邮件模块

目录 创建Smtp对象 Smtp类中的方法 MIME MIMEBase MIMEBase MIMEMultipart MIMEApplication MIMEAudio MIMEImage MIMEText 实例 texthtml格式 发送带图片附件的邮件 发送带附件的邮件 含多种格式 SMTP模块 SMTP 简单传输协议&#xff0c;它是一组用于由源…

JAVA商城源码-多用户商城系统源码-B2B2C商城系统

项目介绍 三勾多商户小程序商城基于springbootelement-uiuniapp打造的面向开发的小程序商城&#xff0c;方便二次开发或直接使用&#xff0c;可发布到多端&#xff0c;包括微信小程序、微信公众号、QQ小程序、支付宝小程序、字节跳动小程序、百度小程序、android端、ios端。 采…

leaflet 导出图片,打印图片(A4横版或竖版)

第093个 点击查看专栏目录 本示例的目的是介绍如何在vue+leaflet中打印图片导出图片。一个简单的leaflet插件示例,添加了一个图标来打印或导出地图。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共85行)安装插…

自然语言处理(NLP)之word2vec的实现(PTB语料库)<找语义相近的词>

在2013年Google开源了一款用于词向量计算的工具&#xff1a;word2vec&#xff0c;它本身不是一种深度学习之类的模型&#xff0c;是一种用于计算词嵌入的体系结构。实际上大家平时说的这个指代的就是前面介绍过的跳字(元)模型与连续词袋模型CBow&#xff1a;自然语言处理(NLP)之…

OpenCV-Python学习(21)—— OpenCV 图像几何变换之图像翻转(cv.flip、np.flip)

1. 学习目标 学习 OpenCV 图像的翻转函数 cv.flip&#xff1b;学习 NumPy 矩阵的反转函数 np.flip&#xff1b;自己实现矩阵反转的函数。 2. OpenCV 翻转 翻转也称镜像&#xff0c;是指将图像沿轴线进行轴对称变换。水平镜像是将图像沿垂直中轴线进行左右翻转&#xff0c;垂直…