进程间通信之消息队列
作用
进程间通信
特点
1 、消息队列中的消息是有类型的。类型 : 自定义的结构体 , 第一个成员必须是 long 型的 . 表示为该消息的类型如 :typedef struct 结构体名称 {long type;// 消息的正文char name[50];char sex[10];int age;...} 别名 ;2 、消息队列中的消息是有格式的。3 、消息队列可以实现消息的随机查询。消息不一定要以先进先出的次序读取,编程时可以按消息的类型读取。发的顺序 :1 2 1 3读 :3,1,1,24 、消息队列允许一个或多个进程向它写入或者读取消息。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: 消息队列 idmsgp: 发送的消息的结构体指针msgsz: 发送的消息的正文大小msgflg: 标记0 : msgsnd 调用阻塞直到条件满足为止。IPC_NOWAIT: 若消息没有立即发送则调用该函数的进程会立即返回。返回值 :成功 0, 失败 -1
msgrcv函数
作用
接收消息
函数
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int
msgflg);参数 :msqid: 消息队列 idmsgp: 接收消息的结构体指针变量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文件的互相转换,csv转excel后若数据超出了单元格的宽度,部分数据无法完整显示。需要手动打开Excel文件࿰…...

移动跨平台框架Flutter详细介绍和学习线路分享
Flutter是一款移动应用程序SDK,一份代码可以同时生成iOS和Android两个高性能、高保真的应用程序。 Flutter目标是使开发人员能够交付在不同平台上都感觉自然流畅的高性能应用程序。我们兼容滚动行为、排版、图标等方面的差异。 在全世界,Flutter正在被越…...
线性代数基础:向量、矩阵、张量及其在机器学习中的应用详解
线性代数基础:向量、矩阵、张量及其在机器学习中的应用详解 线性代数基础:向量、矩阵、张量及其在机器学习中的应用详解一、向量 (Vectors)1. 向量的定义2. 向量在机器学习中的应用3. 向量空间 二、矩阵 (Matrices)1. 矩阵的定义2. 矩阵在机器学习中的应…...
Dockerfile中的RUN、CMD、ENTRYPOINT指令区别
RUN在构建过程中在镜像中执行命令。CMD容器创建时的默认命令。(可以被覆盖)ENTRYPOINT容器创建时的主要命令。(不可被覆盖) 指令介绍 1.RUN 在构建过程中在镜像中执行命令,是在 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分布式特辑
随着大模型的发展,如何进行分布式训练也成了每位开发者必备的技能。 1. 单机训练 CPU OffloadingGradient Checkpointing 正向传播时,不存储当前节点的中间结果,在反向传播时重新计算,从而起到降低显存占用的作用 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(Java Virtual Machine,Java虚拟机)字节码是一种中间代码,主要用于Java平台上的程序在不同硬件平台上的移植。Java程序通过编译器将源代码编译成字节码,然后通过JVM解释或即时编译(…...
python访问mysql
要在 Python 中访问 MySQL 数据库,通常会使用 mysql-connector-python 或 pymysql 这两个库之一。以下是使用这两个库的基本示例: 使用 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上(不能是5G) 二.网络调试助手信息设置绑定 1.获取电脑wifi信息 2.设置网络调试助手为一致,然后打开,主机地址是上面的192.168.2.149端口自己设置,UDP然后打开…...

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

如何利用Java进行快速的足球大小球及亚盘数据处理与分析
在当今信息爆炸的时代,大量的数据产生和积累,对于企业和个人来说,如何高效地处理和分析这些数据成为了一项重要的任务。Java作为一门强大的编程语言,提供了丰富的工具和库,可以帮助我们快速进行数据处理与分析。下面将…...
代码随想录打卡Day29
今天的题目尊嘟好难…除了第三题没看视频,其他的题目都是看了视频才做出来的。二刷等我。 134. 加油站 感觉这道题和之前的53. 最大子序和有点像,最大子序和是一旦当前总和为负数则立即抛弃当前的总和,从下个位置重新开始计算,而…...

图分类!!!
deepwalk 使用图中节点与节点的共现关系来学习节点的向量表示。那么关键的问题就是如何来描述节点与节点的共现关系,DeepWalk给出的方法是使用随机游走(RandomWalk)的方式在图中进行节点采样,RandomWalk是一种可重复访问已访问节点的深度优先遍历算法。给定当前访问…...
高防IP是如何防御攻击
DDoS攻击作为网络攻击中最常见的一种,一般利用大量的虚假流量向目标服务器发起攻击,进而堵塞网络损耗服务器性能,使服务器呈现崩溃状态,令真正的用户无法正常访问发送请求。以前的大型企业通常都是使用高防服务器来抵抗这类攻击&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等技术,可以实现一个高效的车辆检测和测速系统。这样的系统适用于交通监控、智能交通管理系统(ITS)等领域,能够实时识别并跟踪车辆,并估算其速度。 项目介绍 本项目旨在开发…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...