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

进程间通信之消息队列

作用

进程间通信

特点

1 、消息队列中的消息是有类型的。
类型 : 自定义的结构体 , 第一个成员必须是 long 型的 . 表示为该消息的类型
:
typedef struct 结构体名称 {
long type;
// 消息的正文
char name[50];
char sex[10];
int age;
...
} 别名 ;
2 、消息队列中的消息是有格式的。
3 、消息队列可以实现消息的随机查询。消息不一定要以先进先出的次序读取,编程时
可以按消息的类型读取。
发的顺序 :1 2 1 3
:3,1,1,2
4 、消息队列允许一个或多个进程向它写入或者读取消息。
5 、与无名管道、命名管道一样,从消息队列中读出消息,消息队列中对应的数据都会
被删除。
6 、每个消息队列都有消息队列标识符,消息队列的标识符在整个系统中是唯一的。
7 、只有内核重启或人工删除消息队列时,该消息队列才会被删除。若不人工删除消息
队列,消息队列会一直存在于系统中。

消息队列限制值如下:

每个消息内容最多为 8K 字节
每个消息队列容量最多为 16K 字节
系统中消息队列个数最多为 1609
系统中消息个数最多为 16384

注意

System V 提供的 IPC 通信机制需要一个 key 值,通过 key 值就可在系统内获得一

个唯一的消息队列标识符。
key 值可以是人为指定的,也可以通过 ftok 函数获得。
ftok 函数当参数相同时 , 得到的 key 值也将相同

相关命令

ipcs -q

ipcrm -q 要删除的消息队列 id

ftok函数

作用

 获取key

语法

key_t ftok(const char *pathname, int proj_id);

参数 :
pathname: 文件地址 , 保证是存在的路径就行
:
/
~
./
proj_id: 项目 id, 随便给
返回值 :
计算得到的 key

msgget函数

作用

获取消息队列 

语法

头文件

#include <sys/msg.h>
函数
int msgget(key_t key, int msgflg)
功能:
创建一个新的或打开一个已经存在的消息队列。不同的进程调用此函数,只要用相
同的 key 值就能得到同一个消息队列的标识符。
参数:
key IPC 键值。
msgflg :标识函数的行为及消息队列的权限。
msgflg 的取值:
IPC_CREAT :创建消息队列。
IPC_EXCL :检测消息队列是否存在。
位或权限位:消息队列位或权限位后可以设置消息队列的访问权限,格式和
open 函数的 mode_t 一样,但可执行权限未使用。
:
IPC_CREAT | 0666
如果消息队列不存在 , 则创建该消息队列 , 所有用户可读可写
如果消息队列以存在 , 则使用已经存在的消息队列
返回值 :
创建的消息队列的 id, 失败返回 -1

 msgsnd函数

作用

发送消息

函数

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

参数 :
msqid: 消息队列 id
msgp: 发送的消息的结构体指针
msgsz: 发送的消息的正文大小
msgflg: 标记
0 msgsnd 调用阻塞直到条件满足为止。
IPC_NOWAIT: 若消息没有立即发送则调用该函数的进程会立即返回。
返回值 :
成功 0, 失败 -1

msgrcv函数

作用

接收消息

函数

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int

msgflg);
参数 :
msqid: 消息队列 id
msgp: 接收消息的结构体指针变量
msgsz: 接收的消息的正文大小
msgtyp: 接收的消息的类型
msgflg: 标记
0 msgsnd 调用阻塞直到条件满足为止。
IPC_NOWAIT: 若消息没有立即发送则调用该函数的进程会立即返回。

基于消息队列的聊天程序

思路

1,请输入昵称

2, 请输入接收的消息类型
3, 创建消息队列
4, 创建两个子进程 , 一个接收消息 , 一个发送消息
5, 当前进程回收子进程

代码

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#include <wait.h>
typedef struct message{
long type;
char name[50];
char info[300];
char t[50];
}MSG;
char* getTimer()
{
time_t tim;
time(&tim);
struct tm* t =localtime(&tim);
char *tstr = calloc(50,sizeof(char));
sprintf(tstr,"%d %02d %02d %02d:%02d:%02d\n",t->tm_year+1900,t-
>tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
return tstr;
}
int main(int argc, char const *argv[])
{
char name[50] = {0};
printf(" 请输入您的昵称 \n");
fgets(name,50,stdin);
long type = 0;
printf(" 请输入您接收的消息的类型 \n");
scanf("%ld",&type);
int key = ftok("/",777);
int msgid = msgget(key,IPC_CREAT | 0666);
int i = 0;
for (i = 0; i < 2; i++)
{
int pid = fork();
if (pid == 0)
{
break;
}
}
if (i == 0)
{
while(1){
//
MSG m;
strcpy(m.name,name);
printf(" 请输入接收方接收的类型 \n");
scanf("%ld",&(m.type));
printf(" 请输入发送的内容 \n");
scanf("%s",m.info);
strcpy(m.t,getTimer());
msgsnd(msgid,&m,sizeof(MSG)-sizeof(long),0);
if (strcmp(m.info,"886") == 0)
{
break;
}
}
}
if (i == 1)
{
//
while(1){
MSG m;
msgrcv(msgid,&m,sizeof(MSG)-sizeof(long),type,0);
printf("%s(%s) :\n\t%s\n",m.name,m.t,m.info);
if (strcmp(m.info,"886") == 0)
{
break;
}
}
}
if (i == 2)
{
while(waitpid(-1,NULL,WNOHANG) != -1); }
return 0;
}

相关文章:

进程间通信之消息队列

作用 进程间通信 特点 1 、消息队列中的消息是有类型的。 类型 : 自定义的结构体 , 第一个成员必须是 long 型的 . 表示为该消息的类型 如 : typedef struct 结构体名称 { long type; // 消息的正文 char name[50]; char sex[10]; int age; ... } 别名 ; 2 、消息队…...

人生苦短我用Python 5-xlwings自动调整表格

人生苦短我用Python 5-xlwings自动调整表格 前言依赖主要类App类Books类Sheet 类 示例代码 前言 使用pandas库openpyxl库实现了csv与excel文件的互相转换&#xff0c;csv转excel后若数据超出了单元格的宽度&#xff0c;部分数据无法完整显示。需要手动打开Excel文件&#xff0…...

移动跨平台框架Flutter详细介绍和学习线路分享

Flutter是一款移动应用程序SDK&#xff0c;一份代码可以同时生成iOS和Android两个高性能、高保真的应用程序。 Flutter目标是使开发人员能够交付在不同平台上都感觉自然流畅的高性能应用程序。我们兼容滚动行为、排版、图标等方面的差异。 在全世界&#xff0c;Flutter正在被越…...

线性代数基础:向量、矩阵、张量及其在机器学习中的应用详解

线性代数基础&#xff1a;向量、矩阵、张量及其在机器学习中的应用详解 线性代数基础&#xff1a;向量、矩阵、张量及其在机器学习中的应用详解一、向量 (Vectors)1. 向量的定义2. 向量在机器学习中的应用3. 向量空间 二、矩阵 (Matrices)1. 矩阵的定义2. 矩阵在机器学习中的应…...

Dockerfile中的RUN、CMD、ENTRYPOINT指令区别

RUN在构建过程中在镜像中执行命令。CMD容器创建时的默认命令。&#xff08;可以被覆盖&#xff09;ENTRYPOINT容器创建时的主要命令。&#xff08;不可被覆盖&#xff09; 指令介绍 1.RUN 在构建过程中在镜像中执行命令&#xff0c;是在 docker build中执行 2.CMD 作用&am…...

css grid布局属性详解

Grid布局 前言一、认识Grid1.1容器和项目1.2行和列1.3单元格和网格线 二、容器属性2.1.grid-template-columns与grid-template-rows属性2.1.1 直接使用长度单位比如px2.1.2 使用百分比 %2.1.3 使用repeat函数2.1.4 按比例划分 fr 关键字2.1.5 自动填充 auto 关键字2.1.6 最大值…...

Tranformer分布式特辑

随着大模型的发展&#xff0c;如何进行分布式训练也成了每位开发者必备的技能。 1. 单机训练 CPU OffloadingGradient Checkpointing 正向传播时&#xff0c;不存储当前节点的中间结果&#xff0c;在反向传播时重新计算&#xff0c;从而起到降低显存占用的作用 Low Precision…...

【Moveit2官方教程】使用 MoveIt Task Constructor (MTC) 框架来定义和执行一个机器人任务

#include <rclcpp/rclcpp.hpp> // ROS 2 的核心库 #include <moveit/planning_scene/planning_scene.h> // MoveIt 规划场景相关的头文件 #include <moveit/planning_scene_interface/planning_scene_interface.h> // MoveIt 规划场景接口 #include <m…...

使用docker配置wordpress

docker的安装 配置docker yum源 sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo下载最新版本docker sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-…...

JVM字节码

JVM字节码详解 引言 JVM&#xff08;Java Virtual Machine&#xff0c;Java虚拟机&#xff09;字节码是一种中间代码&#xff0c;主要用于Java平台上的程序在不同硬件平台上的移植。Java程序通过编译器将源代码编译成字节码&#xff0c;然后通过JVM解释或即时编译&#xff08…...

python访问mysql

要在 Python 中访问 MySQL 数据库&#xff0c;通常会使用 mysql-connector-python 或 pymysql 这两个库之一。以下是使用这两个库的基本示例&#xff1a; 使用 mysql-connector-python 安装库: pip install mysql-connector-python示例代码: import mysql.connector# 连接到 M…...

Java工具插件

一、springboot集成mqtt订阅 阿里云MQTT使用教程_复杂的世界311的博客-CSDN博客_阿里云mqtt 阿里云创建MQTT服务 先找到产品与服务,然后选择物联网平台,找到公共实例,创建一个产品。 创建产品 然后在左侧下拉栏找到设备管理,在设备管理下拉栏找到设备,然后添加设备。添加…...

Class3——Esp32|Thonny——网络连接主机-wifi连接(源代码带教程)

废话不多说——直接上配置源码和图片 一.电脑连接到wifi上&#xff08;不能是5G&#xff09; 二.网络调试助手信息设置绑定 1.获取电脑wifi信息 2.设置网络调试助手为一致&#xff0c;然后打开&#xff0c;主机地址是上面的192.168.2.149端口自己设置&#xff0c;UDP然后打开…...

特效【生日视频制作】小车汽车黄金色版悍马车身AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程小车汽车黄金色版悍马车身AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 怎么如何做的【生日视频制作】小车汽车黄金色版悍马车身AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 下载AE模板 安装AE软件 把AE模板导入…...

如何利用Java进行快速的足球大小球及亚盘数据处理与分析

在当今信息爆炸的时代&#xff0c;大量的数据产生和积累&#xff0c;对于企业和个人来说&#xff0c;如何高效地处理和分析这些数据成为了一项重要的任务。Java作为一门强大的编程语言&#xff0c;提供了丰富的工具和库&#xff0c;可以帮助我们快速进行数据处理与分析。下面将…...

代码随想录打卡Day29

今天的题目尊嘟好难…除了第三题没看视频&#xff0c;其他的题目都是看了视频才做出来的。二刷等我。 134. 加油站 感觉这道题和之前的53. 最大子序和有点像&#xff0c;最大子序和是一旦当前总和为负数则立即抛弃当前的总和&#xff0c;从下个位置重新开始计算&#xff0c;而…...

图分类!!!

deepwalk 使用图中节点与节点的共现关系来学习节点的向量表示。那么关键的问题就是如何来描述节点与节点的共现关系&#xff0c;DeepWalk给出的方法是使用随机游走(RandomWalk)的方式在图中进行节点采样,RandomWalk是一种可重复访问已访问节点的深度优先遍历算法。给定当前访问…...

高防IP是如何防御攻击

DDoS攻击作为网络攻击中最常见的一种&#xff0c;一般利用大量的虚假流量向目标服务器发起攻击&#xff0c;进而堵塞网络损耗服务器性能&#xff0c;使服务器呈现崩溃状态&#xff0c;令真正的用户无法正常访问发送请求。以前的大型企业通常都是使用高防服务器来抵抗这类攻击&a…...

Kubernetes 系列 | k8s入门运维

目录 一、K8S集群搭建1.1 部署方式1.2 了解kubeadm1.3 部署流程1.3.1 初始化配置1.3.2 安装容器运行时1.3.3 安装K8S软件包1.3.4 创建集群 二、集群高可用1.1 集群高可用-堆叠1.2 集群高可用-集群外etcd 三、Pod运维3.1 Pod运维3.2 Pod的生命周期3.3 Pod状况3.4 Pod阶段3.5 容器…...

yolov8+deepsort+botsort+bytetrack车辆检测和测速系统

结合YOLOv8、DeepSORT、BoTSORT和ByteTrack等技术&#xff0c;可以实现一个高效的车辆检测和测速系统。这样的系统适用于交通监控、智能交通管理系统&#xff08;ITS&#xff09;等领域&#xff0c;能够实时识别并跟踪车辆&#xff0c;并估算其速度。 项目介绍 本项目旨在开发…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

Redis上篇--知识点总结

Redis上篇–解析 本文大部分知识整理自网上&#xff0c;在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库&#xff0c;Redis 的键值对中的 key 就是字符串对象&#xff0c;而 val…...

鸿蒙Navigation路由导航-基本使用介绍

1. Navigation介绍 Navigation组件是路由导航的根视图容器&#xff0c;一般作为Page页面的根容器使用&#xff0c;其内部默认包含了标题栏、内容区和工具栏&#xff0c;其中内容区默认首页显示导航内容&#xff08;Navigation的子组件&#xff09;或非首页显示&#xff08;Nav…...

基于django+vue的健身房管理系统-vue

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.8数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;PyCharm 系统展示 会员信息管理 员工信息管理 会员卡类型管理 健身项目管理 会员卡管理 摘要 健身房管理…...

(12)-Fiddler抓包-Fiddler设置IOS手机抓包

1.简介 Fiddler不但能截获各种浏览器发出的 HTTP 请求&#xff0c;也可以截获各种智能手机发出的HTTP/ HTTPS 请求。 Fiddler 能捕获Android 和 Windows Phone 等设备发出的 HTTP/HTTPS 请求。同理也可以截获iOS设备发出的请求&#xff0c;比如 iPhone、iPad 和 MacBook 等苹…...