当前位置: 首页 > 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;并估算其速度。 项目介绍 本项目旨在开发…...

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

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

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...