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。
- 参数key是唯一表示一个消息队列的关键字,如果用IPC_PRIVATE(值为0),就只能创建一个只有创建者才能访问的消息队列,可用于父子间通信。非0的key(可以通过fork函数获取),表示创建一个可以被多个进程共享的消息队列,实现非亲缘关系的通信。
- 参数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);
从消息队列中获取消息
- 参数msgid指明消息队列的ID;通常是msgget函数成功的返回值。
- 参数msgbuf是消息结构体,他的长度必须要小于系统规定的上限,必须以一个长整型成员变量开始,接受函数将用这个成员变量来确定消息的累心。此结构体必须重写,第一个参数不能修改,其他自定义。
struct msgbuf {long mtype; /* type of message */char mtext[1]; /* message text */
};
- 字段 mtype 是用户自己指定的消息类型(必须是正整数),该结构体第 2 个成员仅仅是一种说明性的结构,实际上用户可以使用任何类型的数据,就是消息内容。
- 参数msgsz是消息体的大小,每个消息体最大不超过4K。
- 参数msgflg可以为0(通常为0)或者IPC_NOWAIT,如果设置 IPC_NOWAIT,则msgsnd 和 msgrcv 都不会阻塞,此时如果队列满并调用 msgsnd 或队列空时调用 msgrcv将返回错误。
- 参数msgtyp类型有三种,msgtyp==0时,接收队列中的第一个消息,msgtyp>0时,接收队列中第一个类型等于msgtyp的消息,msgtyp<0时,接受类型小于等于msgtyp绝对值的第1个最低类型消息。
- 函数
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
是消息队列的控制函数,常用来删除消息队列。
- 参数msqid是msgget返回的消息队列标识符。
- 参数cmd通常是IPC_RMID表示删除消息队列。
- 参数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 消息队列)
文章目录消息队列有亲缘关系的进程使用消息队列通信无亲缘关系的进程使用消息队列通信使用环境:Ubuntu18.04 使用工具:VMWare workstations ,xshell作者在学习Linux的过程中对常用的命令进行记录,通过思维导图的方式梳理知识点&am…...
在Win 11下使用Visual Studio 2019和cygwin编译JBR(Java SDK 17)源码
很多文章介绍了JDK 8和JDK11源码在Linux编译,很少有人介绍了JDK 17在windows的编译过程,所以写了这篇文章,为什么选用JBR 17版本,因为JBR17 版本集成了HotSwapAgent功能,具体HotSwapAgent有什么用,请看我前…...
java基础学习 day51 (匿名内部类)
1. 什么是匿名内部类? 隐藏了名字的内部类,实际名字为:外部类名$序号可以写在成员位置,为没有名字的成员内部类也可以写在局部位置,为没有名字的局部内部类 2. 匿名内部类的格式? new 类名/接口名() { 重…...
Spring MVC程序开发(三大功能)
文章目录一、什么是Spring MVC?1.MVC定义2.MVC与Spring MVC的关系3.创建方式二、Spring MVC的核心功能1.连接功能浏览器获取前端接口和后端程序连接功能实现get和post的区别Spring Boot热部署2.获取参数(1)传递单个参数(2)传递对…...
stack,queue
stack,queuestack的介绍和使用介绍使用模拟实现queue的介绍和使用介绍使用模拟实现priority_queue的介绍和使用介绍使用模拟实现容器适配器概念标准库中stack,queue的底层结构介绍deque原理缺陷deque作为stack,queue底层默认容器stack的介绍和使用 介绍 stack是适…...
shiro反序列化
shiro550反序列化 | 清风的博客这个看着更舒服点 环境搭建 JDK:1.7 Tomcat:8.5.83 shiro源码:下载地址:https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4 shiro war包:下载地址SHIRO-550/samples-…...
【GoF 23 概念理解】IoC/DI(控制反转/依赖注入)
搞清楚以下几个问题你就明白什么是 IoC/DI 了: 参与者都有谁?依赖:谁依赖于谁?为什么要依赖?注入:谁注入于谁?到底注入什么?控制反转:谁控制谁?控制什么&…...
stm32外设-GPIO
0. 写在最前 本栏目笔记都是基于stm32F10x 1. GPIO基本介绍 GPIO—general purpose intput output 是通用输入输出端口的简称,简单来说就是软件可控制的引脚, STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的…...
AfxMessageBox 自定义封装
一般情况下AfxMessageBox是系统提供的一个对话框,若要做这种效果的,必须重写。 实例1: void test_SgxMemDialog_AutoSize() { //使用给定大小的对话框 CSgxMemDialog dlg(180, 60); dlg.SetWindowTitle(_T(" SegeX - CT&qu…...
登入vCenter显示503,证书过期解决办法
登入vCenter显示503 原因:当安全令牌服务 (STS) 证书已过期时,会出现这些问题。这会导致内部服务和解决方案用户无法获取有效令牌,从而导致无法按预期运行(证书两年后就会过期)。 解决办法&…...
设计模式(十九)----行为型模式之命令模式
1、概述 日常生活中,我们出去吃饭都会遇到下面的场景。 定义: 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。命…...
【数据库】数据库基础架构
数据库架构 数据库对于后端程序员来说是每天都需要打交道的系统,因此了解并掌握MySQL底层原理是必须的。 基础架构图 MySQL内部分为两层,一个是Server层,另一个是存储引擎层,而我们常用的就是MyISAM、InnoDB,主要负…...
English Learning - L2 语音作业打卡 双元音 [ɔɪ] [ɪə] Day16 2023.3.8 周三
English Learning - L2 语音作业打卡 双元音 [ɔɪ] [ɪə] Day16 2023.3.8 周三💌发音小贴士:💌当日目标音发音规则/技巧:🍭 Part 1【热身练习】🍭 Part2【练习内容】🍭【练习感受】🍓元音 [ɔ…...
C++语法规则4(C++面向对象)
接口(抽象类) 接口描述了类的行为和功能,而不需要完成类的特定实现。C 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。 如果类中至少有一个函数被声明为纯虚…...
【Spring 深入学习】AOP的前世今生之后续
AOP的前世今生之后续 1. 概述 上篇文章【Spring 深入学习】AOP的前世今生之代理模式我们讲述了代理模式。而我们今天的主人公AOP就是基于代理模式实现的,所以我们今天会简单学习下AOP 2. 什么是AOP 是面向切面编程,一般可以帮助我们在不修改现有代码的情…...
软考高项——配置管理
配置管理配置管理配置管理6个主要活动配置项配置基线配置项的状态配置库配置库权限管理配置审计配置管理 配置管理的总线索包括: 1)配置管理6个主要活动 2)配置项 3)配置基线 4)配置项的状态 5)配置库 6&a…...
网站SEO优化,网站TDK三大标签SEO优化,LOGO SEO优化
SEO(Search Engine Optimization)汉译为搜索引擎优化,是一种利用搜索引擎的规则提高网站在有关搜索 引擎内自然排名的方式。 SEO 的目的是对网站进行深度的优化,从而帮助网站获取免费的流量,进而在搜索引擎上提升网站的…...
select查询语句
worker表的字段有id, d_id, name, sex, birthday, salary, address 编号,部门号,姓名,性别,出生日期,工资,家庭住址 department表的字段有d_id, d_name, function, address 部门号,部门名,部门职能,部门位置 (1)查询worker表的所有记录(用*表示)。 select * fro…...
没有对象感,沟通太费劲
沟通中最重要的感觉:对象感! 要沟通的是谁?以啥方式最好? 趣讲大白话:蹲着跟小孩说话 【趣讲信息科技100期】 ******************************* 对象感是沟通者必须训练和提升的 是换位思考的一种能力 以便跟沟通对象进…...
智能优化算法之遗传算法
该算法已被很多篇文章讲解,本文将会去除很多较简单的内容,挑选认为重点核心部分进行讲述,内容中有属于信息的收集整理部分,也有属于自己理解的部分。 1、遗传算法概述 遗传算法是一类借鉴生物界的进化规律演化而来的随机化搜索方…...
【rabbitmq 实现延迟消息-插件版本安装(docker环境)】
一:插件简介 在rabbitmq 3.5.7及以上的版本提供了一个插件(rabbitmq-delayed-message-exchange)来实现延迟队列功能。同时插件依赖Erlang/OPT 18.0及以上。 二:插件安装 1:选择适合自己安装mq 版本的插件࿱…...
【大数据】HDFS管理员 HaAdmin 集群高可用命令详细使用说明
高可用HaAdmin使用概览使用说明checkHealth查看NameNode的状态所有NN的服务状态查询指定NN的服务状态failovertransitionToActive概览 HDFS高可用特性解决了集群单点故障问题,通过提供了两个冗余的NameNode以主动或被动的方式用于热备,使得集群既可以从…...
京区航天研究所 哪些比较好的研究所?
第一梯队:一院一部、战术武器部、10所、12所、研发部、空天部,五院501所(总体设计部)、502所、通导部、遥感部、钱室(所人均年薪35w-50w级别) 第二梯队:一院14所、15所,二院未来实验…...
Nacos配置拉取及配置动态刷新原理【源码阅读】
Nacos配置拉取及配置刷新原理 一、初始化时获取配置文件 背景 SpringCloud项目中SpringBoot在启动阶段除了会创建SpringBoot容器,还会通过bootstrap.yml构建一个SpringCloud容器,之后会在准备上下文阶段通过SPI加载实现类后,会进行配置合并…...
第十届省赛——9等差数列(集合做法)
题目:试题 I: 等差数列时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分【问题描述】数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中 N 个整数。现在给出这 N 个整数,小明想知道包含这…...
《数据分析-JiMuReport03》JiMuReport报表设计入门介绍-新建报表
报表设计 1 新建报表 1.1 创建新的数据报表 以数据报表为例,简单介绍创建报表的过程 1.2 进入报表设计页面 如下图可见,主要分为四个模块: 模块一(左) 数据集管理报表信息数据字典 模块二(右) 这部分是对数据报表的进一步优化 模块三(上…...
从功能测试进阶自动化测试,爆肝7天整理出这一份超全学习指南【附网盘资源】
因为我最近在分享自动化测试技术,经常被问到:功能测试想转自动化,请问应该怎么入手?有没有好的资源推荐?那么,接下来我就结合自己的经历聊一聊我是如何在工作中做自动化测试的。(学习路线和网盘…...
CNN神经网络——手写体识别
目录 Load The Datesets Defining,Training,Measuring CNN Algorithm Datasets GRAET HONOR TO SHARE MY KNOWLEDGE WITH YOU This paper is going to show how to use keras to relize a CNN model for digits classfication Load The Datesets The datasets files are …...
python调试模块ipdb
1. 调试python ipdb是用来python中用以交互式debug的模块,可以直接利用pip安装; 其功能类似于pycharm中 python控制台, 而使用ipdb 的优点,便是直接在代码中调试, 避免了在python控制台,或者重新设置一些简单变量。…...
【数据库】聊聊MySQL的日志,binlog、undo log、redo log
日志 在数据库中,如何保证数据的回滚,以及数据同步,系统宕机后可以恢复到原来的状态,其实就是依靠日志。 其中bin log是Server层特有的,redo log是Innodb存储引擎特有的。 bin log 是逻辑日志,主要记录这条…...
做lol直播网站/百度百度一下
Oracle使用SQL*Plus生成html文件参考: http://blog.itpub.net/26736162/viewspace-2149543/ Oracle如何使用spool导出utf8字符集的文本文件: http://blog.itpub.net/26736162/viewspace-2639287/ 导出 csv 文件格式 保存以下内容为 spoolc…...
电商网站制作方案/站长统计app进入网址新版小猪
Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: In aggregated query without GROUP BY, expression #3 of SELECT list contains nonaggregated column...
wordpress showposts/seo排名软件
计算机网络 练习(一百一十) 当使用时间到达租约期的()时,DHCP 客户端和 DHCP 服务器将更新租约。 A. 50% B. 75% C. 87.5% D. 100% ---------------------------------------- 答案: A 解析: …...
智慧团建网站什么时候维护好/太原百度快速优化排名
文章目录1、Git分支<1>创建分支<2>切换分支<3>分支合并<4>删除分支1、Git分支 创建分支目的:项目运作同时修改项目内容然后合并。 实际开发的分支: Master:发布 Hotfix: 修改程序的Bug Release:内部发布版 Develop:开发版&am…...
淘客那些网站怎么做的/百度网盘网页版入口官网
摘要: 在前面的学习中,我们都是围绕着一个窗口展开,那么,在这篇文章里面,我们会介绍怎么一次使用多个窗口。 比如说,点击某个按键后弹出一个全新的窗口。很常见的就是一个场景就是,点击退出的时候,弹出一个窗口询问 确认是否退出。效果如下: 1.窗口一的实现: 步骤1:…...
韩国风格网站php源码/厦门网站的关键词自动排名
学习java从零基础到掌握学会可以操作项目,如果要在四个月之内做到,需要在短时间内学习大量内容,一般的培训机构分成四个大的学习阶段,通过每个阶段的学习就能做到符合一些企业基本需求: 第一阶段:javase至…...