Linux进程间通信(消息队列)

news2024/11/28 6:54:43

可以用命令“ipcs”查看三种 IPC,“ipcrm”删除 IPC 对象。在 i.MX6ULL 终结者开发板终端输入“ipcs” 查看系统中存在的 IPC 信息: 

这些 IPC 对象存在于内核空间,应用层使用 IPC 通信的步骤为: 

 

 1. 获取 key 值,内核会将 key 值映射成 IPC 标识符,获取 key 值常用方法:

(1)在 get 调用中将 IPC_PRIVATE 常量作为 key 值。

(2)使用 ftok()生成 key

2. 执行 IPC get 调用,通过 key 获取整数 IPC 标识符 id,每个 id 表示一个 IPC 对 

 3. 通过 id 访问 IPC 对象。

 4. 通过 id 控制 IPC 对

 

创建这三种 IPC 对象都要先获取 key 值,然后根据 key 获取 id,用到的函数如下:

 下面介绍消息队列:

消息队列是类 unix 系统中一种数据传输的机制,其他操作系统中也实现了这种机制,可见这种通信机 制在操作系统中有重要地位。

Linux 内核为每个消息队列对象维护一个 msqid_ds,每个 msqid_ds 对应一个 id,消息以链表形式存储, 并且 msqid_ds 存放着这个链表的信息。

消息队列的特点:

1.发出的消息以链表形式存储,相当于一个列表,进程可以根据 id 向对应的“列表”增加和获取消息。

2.进程接收数据时可以按照类型从队列中获取数据。

消息队列的使用步骤:

1. 创建 key;

2. msgget()通过 key 创建(或打开)消息队列对象 id; 3. 使用 msgsnd()/msgrcv()进行收发; 4. 通过 msgctl()删除 ipc 对象

通过 msgget()调用获取到 id 后即可使用消息队列访问 IPC 对象,消息队列常用 API 如下

 实验代码

msgsend.c  向消息队列里面写

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
struct msgbuf
{
    long mtype;
    char mtext[128];
};

int main(void)
{
    int msgid;
    key_t key;
    struct msgbuf msg;
    // 获取 key 值
    key = ftok("./a.c", 'a');
    // 获取到 id 后即可使用消息队列访问 IPC 对象
    msgid = msgget(key, 0666 | IPC_CREAT);
    if (msgid < 0)
    {
        printf("msgget is error\n");
        return -1;
    }
    printf("msgget is ok and msgid is %d \n", msgid);
    msg.mtype = 1;
    strncpy(msg.mtext, "hello", 5);
    // 发送数据
    msgsnd(msgid, &msg, strlen(msg.mtext), 0);
    return 0;
}

msgread.c 从消息队列里面读

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
struct msgbuf
{
    long mtype;
    char mtext[128];
};
int main(void)
{
    int msgid;
    key_t key;
    struct msgbuf msg;
    key = ftok("./a.c", 'a');
    // 获取到 id 后即可使用消息队列访问 IPC 对象
    msgid = msgget(key, 0666 | IPC_CREAT);
    if (msgid < 0)
    {
        printf("msgget is error\n");
        return -1;
    }
    printf("msgget is ok and msgid is %d \n", msgid);
    // 接收数据
    msgrcv(msgid, (void *)&msg, 128, 0, 0);
    printf("msg.mtype is %ld \n", msg.mtype);
    printf("msg.mtext is %s \n", msg.mtext);
    return 0;
}

在 Ubuntu 上开一个终端,编译运行如下图所示:

 

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

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

相关文章

【网络】交换机的原理和配置方法

目录 &#x1f341;交换机工作原理 &#x1f341;交换机接口的双工模式 &#x1f341;交换机命令行模式 &#x1f341;交换机常见命令 &#x1f9e7;帮助命令 &#x1f9e7;常用命令介绍 &#x1f341;交换机的基本配置 &#x1f9e7;配置接口的双工模式及速率 &#x1f990;博…

数据库误删恢复

说明 经常听说删库跑路这真的不只是一句玩笑话&#xff0c;若不小心删除了数据库&#xff0c;事情很严重。你一个不小心可能会给公司删没。建议研发不要直连生成环境&#xff0c;一般的话都会分配账号权限&#xff0c;生产环境的账号尽量是只读&#xff0c;以防你一个不经意给库…

java快速结束嵌套循环

java快速结束嵌套循环 快速结束for循环 out:for (int i 0; i < 5; i) {in:for (int j 0; j < 5; j) {if (j 2) {break out;}System.out.println("i " i " j " j);}}解释 将外层for循环起别名 o u t \color{red}{out} out,将内层for循环起别名…

Java NIO-非阻塞I/O(一)

文章目录 1. 简介2. 一个示例服务器3. 缓冲区4. 创建缓冲区5. 填充与排空6. 批量方法7. 数据转换8. 视图缓冲区9. 压缩缓冲区10. 复制缓冲区11. 分片缓冲区 1. 简介 与CPU和内存相比&#xff0c;甚至和磁盘相比&#xff0c;网络都很慢&#xff0c;但要允许CPU速度高于网络&…

YOLOV8最强操作教程.

YoloV8详细训练教程. 相信各位都知道yolov8发布了&#xff0c;也是U神大作&#xff0c;而且V8还会出论文喔&#xff01; 2023.1.17 更新 yolov8-grad-cam热力图可视化链接 2023.1.20 更新 YOLOV8改进-添加EIoU,SIoU,AlphaIoU,FocalEIoU 链接 2023.1.30 更新 如果你需要修改或者…

Vector Scope

下面以PicoScope 6403E-034为例说明 1.Scope 硬件结构介绍 前面板&#xff1a; 最多支持捕获2路CAN/CANFD/FlexRay总线&#xff0c;或者4路LIN总线 后面板&#xff1a; Scope Bus Probe 300 Mhz 2.Option Scope使用条件 前提条件1&#xff1a;购买CANoe/CANalyzer Option Sc…

03-SpringBoot3JDK9~17新特性

1、JDK9新特性---jshell交互式工具 前提是已经配置好了Jdk的环境变量。 2、JDK9新特性---模块化开发 需求&#xff1a; testA可以被模块A调用&#xff0c;testB可能是内部工具类&#xff0c;不想被模块A调用&#xff0c;又不能设置成private。 这时候我们就会用到模块化开发。…

vue3+element-plus+ts elplus table 实现表格动态列 表格列显示与隐藏的动态控制 支持传递插槽与多级表头

如题 先上效果 部分代码展示 Home页面 使用时除了名字不同其他没啥不同,但是我这个封装的函数或者属性较少,如果需要请自行增加 <script setup lang"ts"> import { IPage } from /mixins/pagination import { TableKey } from /types/enum import { useRou…

Vue3-01-Vue3 新特性及环境搭建

Vue.js是一种被广泛使用的JavaScript框架&#xff0c;用于构建用户界面和单页面应用。Vue3是其最新的主要版本&#xff0c;引入了许多新特性并做了一些改进。 一、Vue3 性能提升 1. Object.defineProperty VS Proxy Vue2 和 Vue3 在数据响应性系统的实现上采用了不同的方式&…

通则ZLT X21 CPE使用指南

目录 设备介绍应用场景案例详细配置CPE基本配置网络实现DMZ方式实现网络互通IP Passthrough方式实现网络互通 注意事项 设备介绍 ZLT X21 是一款高性能5G室内CPE&#xff0c;支持NR(SA&NSA)、TDD-LTE、FDD-LTE&#xff0c;将蜂窝网络数据转换为WIFI和有线网口数据&#xf…

【项目实战】博客系统设计与实现

一、项目概述 1.项目需求 前端&#xff1a;展示文章&#xff0c;文章分类&#xff0c;评论&#xff0c;用户登录。 后端 &#xff1a;系统管理&#xff1a;用户管理&#xff0c;菜单管理&#xff0c;角色管理。内容管理&#xff1a;文章管理&#xff0c;分类管理&#xff0c;标…

地震勘探基础(一)之地震波

地震波 纵波/P波 (Compressional Wave) &#xff1a;质点的动方向与波的传播方向一致。天然地震时&#xff0c;纵波造成地面上下颠簸震动&#xff0c;纵波先达到地表。 纵波速度与弹性参数的关系&#xff1a;纵波速度与体积模量&#xff0c;杨氏模量&#xff0c;剪切模量&…

tcpdump 抓包工具详细图文教程(下)

目录 一、tcpdump 常用参数的使用 1.1 tcpdump -i # 指定监听网络接口 1.2 tcpdump -w # 将捕获到的信息保存到文件中&#xff0c;且不分析和打印在屏幕 1.3 tcpdump -r # 从文件中读取数据 1.4 tcpdump -n # 不把 ip 转化成域名 1.5 tcpdump -t # 在每行的输出中不…

springboot自定义注解的使用++日志

1.添加切面依赖 <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.9</version> </dependency> 2.自定义注解 Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTI…

Java语言---PriorityQueue与堆

目录 一.堆 1.1堆的概念 1.2堆的存储方式 1.3堆的操作 1.3.1堆的创建 1.3.2代码的实现&#xff1a; 堆的插入元素 堆的删除 二、PriorityQueue 2.1概念 2.2性质 2.3PriorityQueue的创建构造 2.4PriorityQueue的操作方法 总结 &#x1f63d;个人主页&#xff1a;t…

堆的应用:Top-K问题

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下堆的应用--Top-K问题的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; 数据结构与算法专栏&#xff1a;数据结构与算法 个…

基于Web智慧油库三维可视化管理系统

油库是协调原油生产、原油加工、成品油供应及运输的纽带&#xff0c;是国家石油储备和供应的基地&#xff0c;它对于保障国防和促进国民经济高速发展具有相当重要的意义。 建设背景 石油作为重要的战略资源&#xff0c;关系着国家安全和人民生活。油库是石油能源供应链中的关…

俞浩“死磕”抖音,追觅科技618面临三变数

​文 | 智能相对论 作者 | 渡过 智能清洁“新秀”追觅科技来势汹汹。 创始人俞浩曾向媒体表示&#xff0c;“追觅科技……2023年做到行业技术第一&#xff0c;2024年做到行业市占率第一&#xff0c;2025年做到行业利润第一。” 具体到市场上&#xff0c;能拱火热度的电商节…

linux实践php8.2加laravel-cotane和roadrunner服务器

php8.2 composer -v 报错&#xff1a; Deprecation Notice: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in phar:///usr/bin/composer/vendor/symfony/console/Descriptor/TextDescriptor.php:290 解决方法可以升级下composer&#xff1…

像写 Rust 一样写 Python!

几年前&#xff0c;开始使用Rust编程&#xff0c;它逐渐改变了我使用其他编程语言&#xff08;尤其是Python&#xff09;设计程序的方式。在我开始使用Rust之前&#xff0c;我通常以一种非常动态和类型松散的方式编写Python代码&#xff0c;没有类型提示&#xff0c;到处传递和…