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

复习 --- 消息队列

进程间通信机制(IPC)

简述

IPC:Inter Process Communication

进程和进程之间的用户空间相互独立,但是4G内核空间共享,进程间的通信就是通过这4G的内核空间

分类

传统的进程间通信机制

无名管道(pipe)

有名管道(fifo)

信号(signal)

System V中的IPC对象和IPC的区别

消息队列(message queue)

共享内存(shared memory)

信号灯集(semaphore)

可用于主机传输的通信机制

套接字(socket)

消息队列

概念

在内核内存中创建一个队列,进程需要将数据打包成结点,添加到队尾中,或者从队列中读取结点,可以通过消息类型进行消息分类

特点

需要打包,有特定的格式以及消息类型

按照先进先出原则,但是也可以限制消息类型读取

独立于进程,灯进程结束后,消息队列以及其中的内容不会删除,除非中期操作系统或者手动删除

在Linux系统下,可以通过命令ipcs查看消息队列,通过ipcrm -q msqid删除消息队列

函数

ftok()函数,获得一个Key值用来创建消息队列,通过相同的key值可以访问对应的消息队列

msgget()函数创建一个消息队列获得起id号

msgsnd()发送消息到指定消息队列

msgrcv()获取对应消息队列中对应的消息

msgctl()控制消息队列,常用于删除消息队列

#include<myhead.h>
#include<sys/msg.h>
#include<sys/ipc.h>
struct msgbuf
{long mtype;      //消息类型char mtext[128]; //消息内容
};//线程1函数
void *task1(void *arg)
{int msqid = *(int *)arg;//获取消息队列id号struct msgbuf msbuf;//声明消息结构体printf("A:\n\t");fflush(stdout);while (1){msbuf.mtype = 1;//消息类型fgets(msbuf.mtext,sizeof(msbuf.mtext),stdin);msbuf.mtext[strlen(msbuf.mtext)-1]='\0';if(msgsnd(msqid,&msbuf,sizeof(msbuf)-sizeof(long),0) == -1){perror("msgsnd");return NULL;}//printf("线程%d:发送成功\n",getpid());printf("A:\n\t");fflush(stdout);if (!strcmp(msbuf.mtext,"quit")){system("clear");exit(0);}}pthread_exit(NULL);
}//线程2函数
void *task2(void *arg)
{int msqid = *(int *)arg;struct msgbuf buf;ssize_t num = 0;while (1){bzero(&buf,sizeof(buf));if ((num = msgrcv(msqid,&buf,sizeof(buf.mtext),2,0))<0){//perror("msgrcv");return NULL;}printf("\nB:\n\t%s\n",buf.mtext);printf("A:\n\t");fflush(stdout);if (!strcmp(buf.mtext,"quit")){msgctl(msqid,IPC_RMID,NULL);system("clear");exit(0);}}pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{key_t key = ftok("./",0);if (key == -1){perror("ftok");return -1;/* code */}umask(0);int msqid = msgget(key,IPC_CREAT|0664);if (msqid == -1){perror("msgget");return -1;}pthread_t tid1,tid2;if (pthread_create(&tid1,NULL,task1,&msqid) != 0){printf("线程1创建失败\n");}if (pthread_create(&tid2,NULL,task2,&msqid) != 0){printf("线程1创建失败\n");}pthread_join(tid1,NULL);pthread_join(tid2,NULL);return 0;
}
#include<myhead.h>
//#include<sys/msg.h>
//#include<sys/ipc.h>
struct msgbuf
{long mtype;      //消息类型char mtext[128]; //消息内容
};//线程1函数
void *task1(void *arg)
{int msqid = *(int *)arg;struct msgbuf msbuf;printf("B:\n\t");fflush(stdout);while (1){msbuf.mtype = 2;fgets(msbuf.mtext,sizeof(msbuf.mtext),stdin);msbuf.mtext[strlen(msbuf.mtext)-1]='\0';if(msgsnd(msqid,&msbuf,sizeof(msbuf)-sizeof(long),0) == -1){perror("msgsnd");return NULL;}//printf("线程%d:发送成功\n",getpid());printf("B:\n\t");fflush(stdout);if (!strcmp(msbuf.mtext,"quit")){system("clear");exit(0);}}pthread_exit(NULL);
}//线程2函数
void *task2(void *arg)
{int msqid = *(int *)arg;struct msgbuf buf;ssize_t num = 0;while (1){bzero(&buf,sizeof(buf));if ((num = msgrcv(msqid,&buf,sizeof(buf.mtext),1,0))<0){//perror("msgrcv");return NULL;}printf("\nA:\n\t%s\n",buf.mtext);printf("B:\n\t");fflush(stdout);if (!strcmp(buf.mtext,"quit")){msgctl(msqid,IPC_RMID,NULL);system("clear");exit(0);}}pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{key_t key = ftok("./",0);if (key == -1){perror("ftok");return -1;/* code */}umask(0);int msqid = msgget(key,IPC_CREAT|0664);if (msqid == -1){perror("msgget");return -1;}pthread_t tid1,tid2;if (pthread_create(&tid1,NULL,task1,&msqid) != 0){printf("线程1创建失败\n");}if (pthread_create(&tid2,NULL,task2,&msqid) != 0){printf("线程1创建失败\n");}pthread_join(tid1,NULL);pthread_join(tid2,NULL);return 0;
}

相关文章:

复习 --- 消息队列

进程间通信机制(IPC) 简述 IPC&#xff1a;Inter Process Communication 进程和进程之间的用户空间相互独立&#xff0c;但是4G内核空间共享&#xff0c;进程间的通信就是通过这4G的内核空间 分类 传统的进程间通信机制 无名管道&#xff08;pipe&#xff09; 有名管道&…...

AcWing 288. 休息时间,《算法竞赛进阶指南》

288. 休息时间 - AcWing题库 在某个星球上&#xff0c;一天由 N 个小时构成&#xff0c;我们称 0 点到 1 点为第 1 个小时、1 点到 2 点为第 2 个小时&#xff0c;以此类推。 在第 i 个小时睡觉能够恢复 Ui 点体力。 在这个星球上住着一头牛&#xff0c;它每天要休息 B 个小…...

ES6中字符串的扩展

字符串的遍历器接口 使用for…of for(let x of foo) {console.log(x); } // f; o; oat() ES5中的charAt()方法&#xff0c;返回字符串给定位置的字符。但是不能识别码点大于0xFFFF的字符&#xff0c;at方法可以 includes()、startsWith()、endsWith() 用来确定一个字符串是…...

GEO生信数据挖掘(四)数据清洗(离群值处理、低表达基因、归一化、log2处理)

检索到目标数据集后&#xff0c;开始数据挖掘&#xff0c;本文以阿尔兹海默症数据集GSE1297为例 目录 离群值处理 删除 低表达基因 函数归一化&#xff0c;矫正差异 数据标准化—log2处理 完整代码 上节围绕着探针ID和基因名称做了一些清洗工作&#xff0c;还做了重复值检查…...

CI/CD工具中的CI和CD的含义

CI/CD工具中的CI和CD的含义&#xff1f; CI/CD 是现代软件开发方法中广泛使用的一种方法。其中&#xff0c;CI 代表持续集成&#xff08;Continuous Integration&#xff09;&#xff0c;CD 则有两层含义&#xff0c;一是持续交付&#xff08;Continuous Delivery&#xff09;…...

用go获取IPv4地址,WLAN的IPv4地址,本机公网IP地址详解

文章目录 获取IPv4地址获取WLAN的IPv4地址获取本机公网IP地址 获取IPv4地址 下面的代码会打印出本机所有的IPv4地址。这个方法可能会返回多个IP地址&#xff0c;因为一台机器可能有多个网络接口&#xff0c;每个接口可能有一个或多个IP地址。 package mainimport ("fmt&…...

Android自定义Drawable---灵活多变的矩形背景

Android自定义Drawable—灵活多变的矩形背景 在安卓开发中&#xff0c;我们通常需要为不同的按钮设置不同的背景以实现不同的效果&#xff0c;有时还需要这些按钮根据实际情况进行变化。如果采用编写resource中xml文件的形式&#xff0c;就需要重复定义许多只有微小变动的资源…...

ParagonNTFSforMac_15.5.102中文版最受欢迎的NTFS硬盘格式读取工具

Paragon NTFS for Mac是一款可以为您轻松解决Mac平台上不能识别Windows通用的NTFS文件难题&#xff0c;这是一款强大的Mac读写工具&#xff0c;相信在很多时候&#xff0c;Mac用户需要对NTFS文件的移动硬盘进行写入&#xff0c;但是macOS系统默认是不让写入的&#xff0c;使用小…...

Kafka 搭建过程

目录 1.关于Kafka2.Kafka 搭建过程3.参考 本文主要介绍Kafka基本原理&#xff0c;以及搭建过程。 1.关于Kafka Apache Kafka是一个开源的分布式事件流平台&#xff0c;被设计用来实现实时数据流的发布、订阅、存储和处理。 Kafka的主要特性包括&#xff1a; 高吞吐量&#x…...

七、2023.10.1.Linux(一).7

文章目录 1、 Linux中查看进程运行状态的指令、查看内存使用情况的指令、tar解压文件的参数。2、文件权限怎么修改&#xff1f;3、说说常用的Linux命令&#xff1f;4、说说如何以root权限运行某个程序&#xff1f;5、 说说软链接和硬链接的区别&#xff1f;6、说说静态库和动态…...

一文教你搞懂Redis集群

一、Redis主从 1.1、搭建主从架构 单节点的Redis的并发能力是有上限的&#xff0c;要进一步的提高Redis的并发能力&#xff0c;据需要大家主从集群&#xff0c;实现读写分离。 共包含三个实例&#xff0c;由于资源有限&#xff0c;所以在一台虚拟机上&#xff0c;开启多个red…...

树上启发式合并 待补

对于每个子树&#xff0c;直接遍历所有轻儿子&#xff0c;继承重儿子 会了板子后&#xff0c;修改维护的东西和莫队是一样的 洛谷 U41492 #include <bits/stdc.h> #define ll long long #define ull unsigned long long constexpr int N1e55; std::vector<int> e…...

minio分布式文件存储

基本介绍 什么是 MinIO MinIO 是一款基于 Go 语言的高性能、可扩展、云原生支持、操作简单、开源的分布式对象存储产品。基于 Apache License v2.0 开源协议&#xff0c;虽然轻量&#xff0c;却拥有着不错的性能。它兼容亚马逊S3云存储服务接口。可以很简单的和其他应…...

Linux新的IO模型io_uring

一、Linux下的网络通信模型 在网络开发的过程中&#xff0c;需要处理好几个问题。首先是通信的内核支持问题&#xff1b;其次是通信的模型问题&#xff1b;最后是框架问题。这些问题在闭源的OS如Windows上&#xff0c;基本上不算什么大问题&#xff08;因为只能用人家的API&am…...

FFmpeg 命令:从入门到精通 | FFmpeg 基本介绍

FFmpeg 命令&#xff1a;从入门到精通 | FFmpeg 基本介绍 FFmpeg 命令&#xff1a;从入门到精通 | FFmpeg 基本介绍FFmpeg 简介FFmpeg 基础知识复用与解复用编解码器码率和帧率 资料 FFmpeg 命令&#xff1a;从入门到精通 | FFmpeg 基本介绍 本系列文章要解决的问题&#xff1…...

数组篇 第一题:删除排序数组中的重复项

更多精彩内容请关注微信公众号&#xff1a;听潮庭。 第一题&#xff1a;删除排序数组中的重复项 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应…...

堆的初步认识

在学习本节文章前要先了解&#xff1a;大顶堆与小顶堆&#xff1a; &#xff08;优先级队列_加瓦不加班的博客-CSDN博客&#xff09; 堆实现 计算机科学中&#xff0c;堆是一种基于树的数据结构&#xff0c;通常用完全二叉树实现。 什么叫完全二叉树&#xff1f; 答&#x…...

CycleGAN模型之Pytorch实战

一、CycleGAN基本介绍 1. CycleGAN论文:《Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks》 2. 原文代码:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix 3. 网传精简代码:https://github.com/aitorzip/PyTorch-CycleGAN …...

C++(STL容器适配器)

前言&#xff1a; 适配器也称配接器&#xff08;adapters&#xff09;在STL组件的灵活组合运用功能上&#xff0c;扮演着轴承、转换器的角色。 《Design Patterns》对adapter的定义如下&#xff1a;将一个class的接口转换为另一个class的接口&#xff0c;使原本因接口不兼容而…...

软考 系统架构设计师系列知识点之软件架构风格(7)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之软件架构风格&#xff08;6&#xff09; 这个十一注定是一个不能放松、保持“紧”的十一。由于报名了全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff0c;11月4号就要考试&#xff0c;因此…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

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

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

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...