当前位置: 首页 > news >正文

Linux 练习九 (IPC 消息队列)

文章目录

  • 消息队列
  • 有亲缘关系的进程使用消息队列通信
  • 无亲缘关系的进程使用消息队列通信

使用环境:Ubuntu18.04
使用工具:VMWare workstations ,xshell

  作者在学习Linux的过程中对常用的命令进行记录,通过思维导图的方式梳理知识点,并且通过xshell连接vmware中ubuntu虚拟机进行操作,并将练习的截图注解,每句话对应相应的命令,读者可以无障碍跟练。
  第九次练习的重点在于Linux的进程如何使用 消息队列进行进程通信。

消息队列

  • 消息队列和FIFO详细,都是一个队列结构,都可以有多个进程向队列里面写消息,多个进程从队列中读取消息。但是FIFO需要读写两端都事先代开,才能够开始信息的传递。而消息队列可以实现向队列中写消息,需要时再打开读取信息。但是,消息队列先打开读,仍然会阻塞,因为此时没有消息可读。
//头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
  • 函数int msgget(key_t key, int msgflg);创建和访问一个消息。成功返回唯一的消息队列标识符,类似于进程id,失败返回-1。
  1. 参数key是唯一表示一个消息队列的关键字,如果用IPC_PRIVATE(值为0),就只能创建一个只有创建者才能访问的消息队列,可用于父子间通信。非0的key(可以通过fork函数获取),表示创建一个可以被多个进程共享的消息队列,实现非亲缘关系的通信。
  2. 参数msgflg指明队列的访问权限和创建标志,创建标志的可选值为IPC_CREAT和IPC_EXCL,如果单独指定 IPC_CREAT,msgget 要么返回新创建的消息队列 id,要么返回具有相同 key 值的消息队列 id;如果 IPC_EXCL 和 IPC_CREAT 同时指明,则要么创建新的消息队列,要么当队列存在时,调用失败并返回-1。
  • 函数int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 将消息添加到消息队列中
    函数ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); 从消息队列中获取消息
  1. 参数msgid指明消息队列的ID;通常是msgget函数成功的返回值。
  2. 参数msgbuf是消息结构体,他的长度必须要小于系统规定的上限,必须以一个长整型成员变量开始,接受函数将用这个成员变量来确定消息的累心。此结构体必须重写,第一个参数不能修改,其他自定义。
struct msgbuf {long mtype; /* type of message */char mtext[1]; /* message text */
};
  1. 字段 mtype 是用户自己指定的消息类型(必须是正整数),该结构体第 2 个成员仅仅是一种说明性的结构,实际上用户可以使用任何类型的数据,就是消息内容。
  2. 参数msgsz是消息体的大小,每个消息体最大不超过4K。
  3. 参数msgflg可以为0(通常为0)或者IPC_NOWAIT,如果设置 IPC_NOWAIT,则msgsnd 和 msgrcv 都不会阻塞,此时如果队列满并调用 msgsnd 或队列空时调用 msgrcv将返回错误。
  4. 参数msgtyp类型有三种,msgtyp==0时,接收队列中的第一个消息,msgtyp>0时,接收队列中第一个类型等于msgtyp的消息,msgtyp<0时,接受类型小于等于msgtyp绝对值的第1个最低类型消息。
  • 函数int msgctl(int msqid, int cmd, struct msqid_ds *buf); 是消息队列的控制函数,常用来删除消息队列。
  1. 参数msqid是msgget返回的消息队列标识符。
  2. 参数cmd通常是IPC_RMID表示删除消息队列。
  3. 参数buf通常是NULL。

有亲缘关系的进程使用消息队列通信

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
//自定义消息结构体
struct msgbuf
{long mtype;char buf[64];
};int main()
{int msgid = msgget((key_t)1234,IPC_CREAT|0666);//创建一个消息队列if(msgid == -1){	//创建失败的处理perror("msgget error");exit(-1);}struct msgbuf msg;memset(&msg,0,sizeof(struct msgbuf));if(fork()>0){	//父进程处理msg.mtype = 1;strcpy(msg.buf,"hello");msgsnd(msgid,&msg,sizeof(msg.buf),0);	//将消息放入消息队列wait(NULL);		//等待子进程结束msgctl(msgid,IPC_RMID,NULL);	//删除消息队列exit(0);}else{	//子进程处理sleep(2);	//让父进程有时间将消息放入消息队列msgrcv(msgid,&msg,sizeof(msg.buf),1,0);	//从消息队列中取出消息puts(msg.buf);	//打印取出的消息值exit(0);}return 0;
}

运行效果:
在这里插入图片描述

无亲缘关系的进程使用消息队列通信

消息发送端源代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
#include <unistd.h>
#define BUFFER 255
struct msgtype
{long mtype;char buffer[BUFFER+1];
};int main()
{int msgid = msgget((key_t)1234,0666|IPC_CREAT);	//获取唯一id1234的消息队列if(msgid == -1){perror("msgget");exit(1);}struct msgtype msg;memset(&msg,0,sizeof(struct msgtype));msg.mtype = 1;		//设置消息类型为2strncpy(msg.buffer,"hello",BUFFER);msgsnd(msgid,&msg,sizeof(msg.buffer),0);	//想msgid的消息队列发送消息memset(&msg,0,sizeof(msg);	//清空结构体msgrcv(msgid,&msg,sizeof(msg.buffer),2,0);	//从msgid的消息队列接收消息printf("接收到的消息内容是:%s\n",msg.buffer);return 0;
}

消息接收端源代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/stat.h>
#include <sys/msg.h>
#include <sys/wait.h>
#define BUFFER 255struct msgtype
{long mtype;char buffer[BUFFER+1];
};int main()
{int msgid = msgget((key_t)1234,0666|IPC_CREAT);	//获取唯一id1234的消息队列if(msgid == -1){perror("msgget");exit(1);}struct msgtype msg;memset(&msg,0,sizeof(struct msgtype));while(1){msgrcv(msgid,&msg,sizeof(msg.buffer),1,0);	//从msgid的消息队列接收消息,类型为1printf("接收端端收到的消息:%s\n",msg.buffer);msg.mtype = 2;		//设置消息类型为2strncpy(msg.buffer,"world",BUFFER);msgsnd(msgid,&msg, sizeof(msg.buffer),0); //向msgid的消息队列发送消息if(sizeof(msg.buffer)!=0){break;}}return 0;
}

两个窗口运行结果:
在这里插入图片描述

相关文章:

Linux 练习九 (IPC 消息队列)

文章目录消息队列有亲缘关系的进程使用消息队列通信无亲缘关系的进程使用消息队列通信使用环境&#xff1a;Ubuntu18.04 使用工具&#xff1a;VMWare workstations &#xff0c;xshell作者在学习Linux的过程中对常用的命令进行记录&#xff0c;通过思维导图的方式梳理知识点&am…...

在Win 11下使用Visual Studio 2019和cygwin编译JBR(Java SDK 17)源码

很多文章介绍了JDK 8和JDK11源码在Linux编译&#xff0c;很少有人介绍了JDK 17在windows的编译过程&#xff0c;所以写了这篇文章&#xff0c;为什么选用JBR 17版本&#xff0c;因为JBR17 版本集成了HotSwapAgent功能&#xff0c;具体HotSwapAgent有什么用&#xff0c;请看我前…...

java基础学习 day51 (匿名内部类)

1. 什么是匿名内部类&#xff1f; 隐藏了名字的内部类&#xff0c;实际名字为&#xff1a;外部类名$序号可以写在成员位置&#xff0c;为没有名字的成员内部类也可以写在局部位置&#xff0c;为没有名字的局部内部类 2. 匿名内部类的格式&#xff1f; new 类名/接口名() { 重…...

Spring MVC程序开发(三大功能)

文章目录一、什么是Spring MVC?1.MVC定义2.MVC与Spring MVC的关系3.创建方式二、Spring MVC的核心功能1.连接功能浏览器获取前端接口和后端程序连接功能实现get和post的区别Spring Boot热部署2.获取参数&#xff08;1&#xff09;传递单个参数&#xff08;2&#xff09;传递对…...

stack,queue

stack,queuestack的介绍和使用介绍使用模拟实现queue的介绍和使用介绍使用模拟实现priority_queue的介绍和使用介绍使用模拟实现容器适配器概念标准库中stack&#xff0c;queue的底层结构介绍deque原理缺陷deque作为stack,queue底层默认容器stack的介绍和使用 介绍 stack是适…...

shiro反序列化

shiro550反序列化 | 清风的博客这个看着更舒服点 环境搭建 JDK&#xff1a;1.7 Tomcat&#xff1a;8.5.83 shiro源码&#xff1a;下载地址&#xff1a;https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4 shiro war包&#xff1a;下载地址SHIRO-550/samples-…...

【GoF 23 概念理解】IoC/DI(控制反转/依赖注入)

搞清楚以下几个问题你就明白什么是 IoC/DI 了&#xff1a; 参与者都有谁&#xff1f;依赖&#xff1a;谁依赖于谁&#xff1f;为什么要依赖&#xff1f;注入&#xff1a;谁注入于谁&#xff1f;到底注入什么&#xff1f;控制反转&#xff1a;谁控制谁&#xff1f;控制什么&…...

stm32外设-GPIO

0. 写在最前 本栏目笔记都是基于stm32F10x 1. GPIO基本介绍 GPIO—general purpose intput output 是通用输入输出端口的简称&#xff0c;简单来说就是软件可控制的引脚&#xff0c; STM32芯片的GPIO引脚与外部设备连接起来&#xff0c;从而实现与外部通讯、控制以及数据采集的…...

AfxMessageBox 自定义封装

一般情况下AfxMessageBox是系统提供的一个对话框&#xff0c;若要做这种效果的&#xff0c;必须重写。 实例1&#xff1a; void test_SgxMemDialog_AutoSize() { //使用给定大小的对话框 CSgxMemDialog dlg(180, 60); dlg.SetWindowTitle(_T(" SegeX - CT&qu…...

登入vCenter显示503,证书过期解决办法

登入vCenter显示503 原因&#xff1a;当安全令牌服务 &#xff08;STS&#xff09; 证书已过期时&#xff0c;会出现这些问题。这会导致内部服务和解决方案用户无法获取有效令牌&#xff0c;从而导致无法按预期运行&#xff08;证书两年后就会过期&#xff09;。 解决办法&…...

设计模式(十九)----行为型模式之命令模式

1、概述 日常生活中&#xff0c;我们出去吃饭都会遇到下面的场景。 定义&#xff1a; 将一个请求封装为一个对象&#xff0c;使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通&#xff0c;这样方便将命令对象进行存储、传递、调用、增加与管理。命…...

【数据库】数据库基础架构

数据库架构 数据库对于后端程序员来说是每天都需要打交道的系统&#xff0c;因此了解并掌握MySQL底层原理是必须的。 基础架构图 MySQL内部分为两层&#xff0c;一个是Server层&#xff0c;另一个是存储引擎层&#xff0c;而我们常用的就是MyISAM、InnoDB&#xff0c;主要负…...

English Learning - L2 语音作业打卡 双元音 [ɔɪ] [ɪə] Day16 2023.3.8 周三

English Learning - L2 语音作业打卡 双元音 [ɔɪ] [ɪə] Day16 2023.3.8 周三&#x1f48c;发音小贴士&#xff1a;&#x1f48c;当日目标音发音规则/技巧:&#x1f36d; Part 1【热身练习】&#x1f36d; Part2【练习内容】&#x1f36d;【练习感受】&#x1f353;元音 [ɔ…...

C++语法规则4(C++面向对象)

接口&#xff08;抽象类&#xff09; 接口描述了类的行为和功能&#xff0c;而不需要完成类的特定实现。C 接口是使用抽象类来实现的&#xff0c;抽象类与数据抽象互不混淆&#xff0c;数据抽象是一个把实现细节与相关的数据分离开的概念。 如果类中至少有一个函数被声明为纯虚…...

【Spring 深入学习】AOP的前世今生之后续

AOP的前世今生之后续 1. 概述 上篇文章【Spring 深入学习】AOP的前世今生之代理模式我们讲述了代理模式。而我们今天的主人公AOP就是基于代理模式实现的&#xff0c;所以我们今天会简单学习下AOP 2. 什么是AOP 是面向切面编程&#xff0c;一般可以帮助我们在不修改现有代码的情…...

软考高项——配置管理

配置管理配置管理配置管理6个主要活动配置项配置基线配置项的状态配置库配置库权限管理配置审计配置管理 配置管理的总线索包括&#xff1a; 1&#xff09;配置管理6个主要活动 2&#xff09;配置项 3&#xff09;配置基线 4&#xff09;配置项的状态 5&#xff09;配置库 6&a…...

网站SEO优化,网站TDK三大标签SEO优化,LOGO SEO优化

SEO&#xff08;Search Engine Optimization&#xff09;汉译为搜索引擎优化&#xff0c;是一种利用搜索引擎的规则提高网站在有关搜索 引擎内自然排名的方式。 SEO 的目的是对网站进行深度的优化&#xff0c;从而帮助网站获取免费的流量&#xff0c;进而在搜索引擎上提升网站的…...

select查询语句

worker表的字段有id, d_id, name, sex, birthday, salary, address 编号,部门号,姓名,性别,出生日期,工资,家庭住址 department表的字段有d_id, d_name, function, address 部门号,部门名,部门职能,部门位置 (1)查询worker表的所有记录(用*表示)。 select * fro…...

没有对象感,沟通太费劲

沟通中最重要的感觉&#xff1a;对象感&#xff01; 要沟通的是谁&#xff1f;以啥方式最好&#xff1f; 趣讲大白话&#xff1a;蹲着跟小孩说话 【趣讲信息科技100期】 ******************************* 对象感是沟通者必须训练和提升的 是换位思考的一种能力 以便跟沟通对象进…...

智能优化算法之遗传算法

该算法已被很多篇文章讲解&#xff0c;本文将会去除很多较简单的内容&#xff0c;挑选认为重点核心部分进行讲述&#xff0c;内容中有属于信息的收集整理部分&#xff0c;也有属于自己理解的部分。 1、遗传算法概述 遗传算法是一类借鉴生物界的进化规律演化而来的随机化搜索方…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...