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

【Linux】进程间通信(三):命名管道

📝前言:

这篇文章我们来讲讲Linux 进程间通信(三)——命名管道

🎬个人简介:努力学习ing
📋个人专栏:Linux
🎀CSDN主页 愚润求学
🌄其他专栏:C++学习笔记,C语言入门基础,python入门基础,C++刷题专栏


这里写目录标题

  • 一,命名管道介绍
    • 1. 原理介绍
    • 2. 简单创建
    • 3. 简单使用
    • 4. 管道文件特殊的读写规则
    • 5. 命名管道删除
  • 二,使用示例
    • 错误和退出宏
    • 示例1
      • 思路
      • 代码
      • 运行
    • 示例2
      • 思路
      • 代码
      • 运行

一,命名管道介绍

之前我们介绍过了匿名管道,匿名管道通常用于有血缘关系的进程。那如果两个毫无关系的进程之间要进行通信,这时候就需要用到我们的命名管道。

1. 原理介绍

首先,想要进行进程间通信,就要让两个进程看到同一份资源!这份资源就是文件!
命名管道的原理和匿名管道基本相同,都是要让两个进程看到同一份文件。那两个没有血缘关系的进程是如何做到的呢?

在这里插入图片描述

  • 当两个进程打开同一路径下的同一个文件的时候,对应的文件描述符会被写入对应进程的文件描述符表中
  • 而对应文件的struct file其实是会被拷贝一份的(尽管两个struct file描述的都是c.txt文件,但是两个进程可能会在文件中有不同的读写位置不同的struct file就会记录)
  • 但是文件的 inode 和 文件内核缓冲区(这是文件在内存中真正的主体)是不会拷贝的,因为都是同一个文件的。
  • 即:因为路径具有唯一性,两个进程利用路径的唯一性看到了同一个文件(资源)。因为文件有文件名,所以叫做命名管道。

问题是,对于普通文件来说,IO会往磁盘刷新!
所以,OS提供了一种特殊的文件:管道文件,这种文件不会往磁盘刷新。这样两个进程就可以通过读写这个文件来实现通信!

2. 简单创建

我们用mkfifo来创建管道文件,命令和库函数同名

命令:
在这里插入图片描述
库函数:
在这里插入图片描述

  • 参数:(文件路径,创建文件时的权限)
  • 返回值:成功:0,失败:-1

示例(命令行创建):

mkfifo fifo.txt

在这里插入图片描述
这个p就代表是管道文件

示例(库函数创建):

#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
int main()
{int ret = mkfifo("fifo2.txt", 0666);if(ret == 0)std::cout << "创建管道文件fifo2.txt成功" << std::endl;return 0;
}

在这里插入图片描述
当命名管道创建好后,和普通文件的使用放个一模一样。先打开,然后再读写操作。

3. 简单使用

命令行输入:echo "hello world" > fifo.txt
结果:
在这里插入图片描述
就像被卡柱一样,直到我们cat fifo.txt才有反应:
在这里插入图片描述
在这里插入图片描述
这是因为,管道文件有特殊的读写规则。

4. 管道文件特殊的读写规则

管道文件的读写端必须都打开了才能工作,不然一段会端塞。

以上面的例子为例,

  • 当使用 echo "hello world" > fifo.txt 往管道写数据时,必须有另一个进程在管道的读端等待读取数据,否则写操作会被阻塞

  • 同理,如果先打开读端,但是写端没有打开,读端也会阻塞等待写端打开。

5. 命名管道删除

使用unlink
在这里插入图片描述
当然,命令行也可以用rm
在这里插入图片描述
系统调用删,常用于代码中

二,使用示例

错误和退出宏

  • 当一个操作错误时,C语言会设置对应的错误码在errno,我们可以通过perror来打印对应错误码的错误信息。
  • 如果我们想在打印错误信息后立刻终止程序,可以添加exit操作

上述两个操作,我们可以用一个宏 + do...while(0)来包装一下

#define ERR_EXIT(m) \
do { \perror(m); \exit(EXIT_FAILURE); \
} while(0)
  • do...while(0):只是为了提供一个能用于代码块包装的{}
  • 后续写代码时,我们直接调用ERR_EXIT(m)m为我们传入的字符串提示信息
  • 因为宏是要写到一行的,\是为了换行
  • EXIT_FAILURE 是标准库 <stdlib.h> 中已经定义的宏(通常值为 1

示例1

思路

重建两个进程,利用命名管道进行文件的拷贝:把file1.txt 的 内容拷贝到 file2.txt

基本思路:

  • 一个进程往命名管道里面写入file1.txt的内容
  • 另一个进程从命名管道读内容,写入file2.txt

代码

WriteN 文件:

#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <cstdlib>
#include <fcntl.h>
#include <unistd.h>using namespace std;#define ERR_EXIT(m)         \do                      \{                       \perror(m);          \exit(EXIT_FAILURE); \} while (0)int main()
{// 创建命名管道int m = mkfifo("tp", 0666);if (m < 0)ERR_EXIT("mkfifo"); // 代表mkfifo这个行为发生错误// 打开原有文件int infd = open("file1.txt", O_RDONLY);if (infd < 0)ERR_EXIT("open");// 打开命名管道int outfd = open("tp", O_WRONLY);if (outfd < 0)ERR_EXIT("open");// 把原有文件的内容输出到命名管道char buffer[1024];int n;while ((n = read(infd, buffer, sizeof(buffer))) > 0) // 当还读到有数据时{write(outfd, buffer, n);}close(infd);close(outfd);return 0;
}

ReadN文件:

#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <cstdlib>
#include <fcntl.h>
#include <unistd.h>using namespace std;#define ERR_EXIT(m)         \do                      \{                       \perror(m);          \exit(EXIT_FAILURE); \} while (0)int main()
{// 打开命名管道int infd = open("tp", O_RDONLY);if(infd < 0) ERR_EXIT("open");// 打开要写入的文件int outfd = open("file2.txt", O_CREAT | O_WRONLY | O_TRUNC, 0666);if (outfd < 0)ERR_EXIT("open");// 把命名管道的内容写到要拷贝到的文件char buffer[1024];int n;while((n = read(infd, buffer, sizeof(buffer))) > 0) // 当还读到有数据时{write(outfd, buffer, n);}close(infd);close(outfd);// 删除命名管道unlink("tp");return 0;
}

运行

一个终端先运行writer,另一个终端再运行reader,就完成了文件拷贝工作
在这里插入图片描述

示例2

思路

  • 利用命名管道建立一个服务段和客户端对话的窗口。
  • 客户端往命名管道里面写数据。
  • 服务段从命名管道里面读数据。

代码

comm.hpp文件:

#pragma once#include <string>
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>#define PATH "."
#define FILENAME "fifo"using namespace std;#define ERR_EXIT(m)         \do                      \{                       \perror(m);          \exit(EXIT_FAILURE); \} while (0)class NamedPipe
{
public:NamedPipe(string path, string name): _path(path), _name(name){_fifoname = _path + "/" + _name;int m = mkfifo(_fifoname.c_str(), 0666);if (m < 0)ERR_EXIT("mkfifo");cout << "mkfifo " << _fifoname << "sucess" << endl;}~NamedPipe(){int u = unlink(_fifoname.c_str());if (u < 0)ERR_EXIT("unlink");cout << "unlink " << _fifoname << "sucess" << endl;}private:string _path;string _name;string _fifoname;
};class Link // 服务端和用户端通过这个Link对象来进行对话
{
public:Link(const string& path, const string& name) // 这个构造只是为了把上面创建的命名管道的信息拿下来: _path(path), _name(name){_fifoname = _path + "/" + _name;cout << "Link " << _fifoname << " -> sucess" << endl;}void LinkForWrite(){// 当命名管道创建好了以后,就当做普通文件一样访问_fd = open(_fifoname.c_str(), O_WRONLY | O_TRUNC);if (_fd < 0)ERR_EXIT("open");cout << "Now you can write something to server " << endl;}void LinkForRead(){_fd = open(_fifoname.c_str(), O_RDONLY);if (_fd < 0)ERR_EXIT("open");cout << "Now you can read from client " << endl;}void Write(){while (true){string message;getline(cin, message);if(message == "quit"){break;}write(_fd, message.c_str(), message.size());}}void Read(){while (true){char buffer[1024];int n = read(_fd, buffer, sizeof(buffer) - 1);buffer[n] = '\0';if (n > 0){cout << buffer << endl;}else if (n == 0){cout << "cilent quit... now server quit" << endl;exit(EXIT_SUCCESS);}else{ERR_EXIT("read");}}}void Close(){close(_fd);}private:string _path;string _name;string _fifoname;int _fd;
};

client.cpp文件:

#include "comm.hpp"int main()
{Link Client(PATH, FILENAME);Client.LinkForWrite();Client.Write();Client.Close();
}

server.cpp文件

#include "comm.hpp"int main()
{// 创建命名管道// 构造时创建,进程结束时,自动析构NamedPipe fifo(PATH, FILENAME);Link Server(PATH, FILENAME);Server.LinkForRead();Server.Read();Server.Close();
}

Makefile文件:

.PHONY:all
all:client server
client:client.cppg++ -o $@ $^ -std=c++11
server:server.cppg++ -o $@ $^ -std=c++11.PHONY:clean
clean:rm -f client server
  • 伪目标all(不对应实际文件,仅用于执行命令),依赖于clientserver
  • make 执行all的时候,就会去执行clientserver目标

运行

在这里插入图片描述

在这里插入图片描述


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

相关文章:

【Linux】进程间通信(三):命名管道

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲Linux 进程间通信&#xff08;三&#xff09;——命名管道 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;Linux &#x1f380;CSDN主页 愚润求学 &#x1f304;其他专栏&#xff1a;C学习…...

人工智能+:职业技能培训的元命题与能力重构

当“人工智能”成为各行各业的热门命题时&#xff0c;我们似乎跳过了一个更根本的思考&#xff1a;人类究竟需要怎样的AI能力&#xff1f;这个问题不解决&#xff0c;任何技术赋能都可能沦为无本之木。真正的挑战不在于如何应用AI&#xff0c;而在于如何定义人与AI的能力边界—…...

HarmonyOS5云服务技术分享--云存储SDK文章整理

在HarmonyOS ArkTS应用中集成华为云存储SDK指南 大家好呀&#xff01;今天咱们来聊聊如何将华为云存储SDK集成到基于ArkTS&#xff08;API 9-11&#xff09;的HarmonyOS应用中。这篇指南会手把手带你完成从环境准备到代码实现的完整流程&#xff0c;过程中遇到的常见问题也会贴…...

《财务自由之路Ⅱ》理论篇

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 欢迎评论交流&#xff0c;感谢您的阅读&#x1f604;。 目录 引言认知赚钱方式收入与负债都很重要整天工作的人&#xff0c;没有时间赚钱 一些建议做法…...

AI筑基,新质跃升|英码科技亮相华为广东新质生产力创新峰会,发布大模型一体机新品,助力产业智能化转型

5月15日&#xff0c;以“AI筑基&#xff0c;新质跃升”为主题的华为中国行2025广东新质生产力创新峰会在惠州圆满召开。本次峰会聚焦人工智能、算力基础设施等新ICT技术如何驱动“新质生产力”&#xff0c;共探广东高质量发展新路径。英码科技受邀出席本次峰会&#xff0c;并携…...

【C++】C++的拷贝构造函数介绍使用

拷贝构造函数 1.作用示例代码1&#xff1a;拷贝构造函数的调用示例代码2&#xff1a;系统默认的拷贝构造做的事情示例代码3&#xff1a;写法1-4示例代码4&#xff1a;写法5示例代码5&#xff1a;C编译器默认给类提供了4中隐含的方法 2.语法规则示例代码&#xff1a; 3.深拷贝和…...

能管理MySQL、Oracle、达梦数据库的桌面管理软件开源了

能管理MySQL、Oracle、达梦数据库的桌面管理软件开源了 能管理MySQL、Oracle、达梦数据库的桌面管理软件开源了1.项目介绍2. 项目源码开发2.1克隆项目2.2 配置并运行 3.使用3.1添加数据库连接3.2新增表3.3操作表3.4 运行sql 4.总结 能管理MySQL、Oracle、达梦数据库的桌面管理…...

5.20打卡

浙大疏锦行 DAY 31 文件的规范拆分和写法 知识点回顾 1. 规范的文件命名 2. 规范的文件夹管理 3. 机器学习项目的拆分 4. 编码格式和类型注解 作业&#xff1a;尝试针对之前的心脏病项目&#xff0c;准备拆分的项目文件&#xff0c;思考下哪些部分可以未来复用。 预处理&am…...

unity XCharts插件生成曲线图在UICanvas中

【推荐100个unity插件之22】基于UGUI的功能强大的简单易用的Unity数据可视化图表插件——XCharts3.0插件的使用_unity xcharts-CSDN博客...

创建thinkphp项目并配置数据库

配置环境并引入UI ssr模式 使用 composer 命令在指定的目录安装 Thinkphp6.x composer create-project topthink/think tp6demo出现Fatal error: Directive ‘track_errors’ is no longer available in PHP in Unknown on line 0说明你的php版本较高&#xff0c;在php.ini中…...

头歌实践平台:动态NAT配置

第一&#xff1a;打开GNS3&#xff0c;创建名为nat的项目文件 第二&#xff1a;创建网络拓扑结构如下&#xff1a; note:s端口线需要在关闭路由器的情况下双击进入&#xff0c;选配4T端口&#xff08;不要忘记点击OK&#xff09; 第三&#xff1a;打开所有设备&#xff08;所…...

贝叶斯优化+CNN+LSTM=小论文创新点

2周速成小论文可能吗&#xff1f;有点悬&#xff0c;但有可能。今天我就给论文er推荐一个高潜力、易创新、适合速发的小论文选题&#xff1a;贝叶斯优化CNNLSTM&#xff01; 这种“三结合”的优势在于技术成熟度高&#xff08;经典CNN和LSTM&#xff09;、创新点灵活性强&…...

软考中级软件设计师——计算机网络 IP地址与子网掩码相关题型

一、常见题型分类 题型考查重点解题关键子网划分根据需求划分子网&#xff0c;计算网络地址、广播地址、可用主机范围等二进制与十进制转换&#xff0c;子网掩码计算&#xff0c;网络位与主机位划分子网掩码转换CIDR表示法&#xff08;如/24&#xff09;与点分十进制&#xff…...

bi报表是什么意思?如何制作一张bi报表?

目录 一、BI 报表是什么意思&#xff1f; 1. BI 报表的基本概念 2. BI 报表的特点 3. BI 报表的作用 二、制作 BI 报表的前期准备 1. 明确报表的目标和需求 2. 确定数据来源 3. 选择合适的 BI 工具 三、制作 BI 报表的具体步骤 1. 数据收集与整理 2. 数据分析 3. 可…...

vivado fpga程序固化

一般下载到fpga上的程序在掉电之后就会丢失&#xff0c;如果想要掉电之后程序不丢失&#xff0c;就需要将比特流文件固化到板载的flash上。 以下以我的7a100t开发板为例&#xff0c;介绍程序固化的流程 点击OK就可以下载了。...

人生的真谛杂谈

文章目录 自我的哲学奠基自我存在的真实性身体与思想的决定关系自由意志自我的当代解构 三观的意义系统构建世界观&#xff1a;认知世界的根基人生观&#xff1a;生命意义的探索价值观&#xff1a;行为选择的准则三观构建的终极目标 价值的哲学解构价值的本体论价值客观性的形而…...

【Java】继承和多态在 Java 中是怎样实现的?

extends 关键字 class 子类 extends 父类 {... } // 类继承是单继承父类的哪些成员被继承 ? 访问修饰符 public 和 protected 修饰的父类成员字段和成员方法可以被继承 , 父类的默认方法只能在同包下继承 , 父类的 private 成员和构造方法不可继承 . super 关键字 表示父类…...

输出字母在字符串中位置索引

输入一个字符串&#xff0c;再输入两个字符&#xff0c;求这两个字符在字符串中的索引。 输入格式: 第一行输入字符串 第二行输入两个字符&#xff0c;用空格分开。 输出格式: 从右向左输出字符和索引&#xff0c;即下标最大的字符最先输出。每行一个。 输入样例: 在这里…...

Oracle中如何解决LATCH:CACHE BUFFERS LRU CHAIN

简单来讲&#xff0c;Oracle为了高效管理BUFFER CACHE主要使用以下2种LRU列&#xff1a; LRU列&#xff0c;又叫替换列&#xff08;replacement list&#xff09;&#xff0c;其中又分为主列和辅助列。 主列&#xff1a;已使用的缓冲区列&#xff0c;分为HOT和COLD区域。HOT区…...

FPGA:基于Vivado的仿真流程与波形调试实践

在FPGA开发过程中&#xff0c;仿真是验证设计逻辑正确性的关键环节。尤其在复杂系统中&#xff0c;单靠硬件板级调试远远不够&#xff0c;往往需要依赖仿真工具提前发现潜在问题&#xff0c;提升开发效率。本文将结合Xilinx Vivado设计套件&#xff0c;系统梳理从仿真环境构建到…...

前端流行框架Vue3教程:20. 插槽slot(2)

插槽slot&#xff08;2&#xff09; 渲染作用域 插槽内容可以访问到父组件的数据作用域&#xff0c;因为插槽内容本身是在父组件模板中定义的 SlotsTow.vue <script> export default {data() {return {};} } </script><template><h3>Slots续集</…...

CodeBuddy全新升级:体验Craft智能体的对话式编程革命

本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 腾讯云AI编程助手官网&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 目录 引言&#xff1a;软件开发的新范式 一、Craft智能体核心功能解析 1.1 自然语…...

基于SpringBoot+Vue的学籍管理系统的设计与实现

获取源码&#xff1a;SpringBootVue的学籍管理系统: 学籍管理系统&#xff1a;登录、个人中心、学生管理、教师管理、学院管理、专业管理、班级信息管理、课程信息管理、学生成绩管理、学生学籍管理、招生信息录入等功能 系统演示视频地址&#xff1a;SpringBootVue的学籍管理…...

【动态规划】P10988 [蓝桥杯 2023 国 Python A] 走方格|普及+

本文涉及知识点 C动态规划 P10988 [蓝桥杯 2023 国 Python A] 走方格 题目描述 给定一个 N N N 行 N N N 列的方格&#xff0c;第 i i i 行第 j j j 列的方格坐标为 ( i , j ) (i, j) (i,j)&#xff0c;高度为 H i , j H_{i,j} Hi,j​。小蓝从左上角坐标 ( 0 , 0 ) …...

pycharm无法正常调试问题

pycharm无法正常调试问题 1.错误代码 已连接到 pydev 调试器(内部版本号 231.8109.197)Traceback (most recent call last):File "E:\Python\pycharm\PyCharm 2023.1\plugins\python\helpers\pydev\_pydevd_bundle\pydevd_comm.py", line 304, in _on_runr r.deco…...

自学嵌入式 day21 - 数据结构 双向链表

1.双向链表 2.基础操作 &#xff08;1&#xff09;头部插入 int InsertHeadDouLinkList(DouLinkList *dl,DATATYPE *data) { DouLinkNode *newnode (DouLinkNode *)malloc(sizeof(DouLinkNode));//定义新节点来存储需插入的数据 if(NULL newnode)//判断结点空间…...

Ubuntu 22.04安装zabbix7.0.0图形中文乱码

在 Ubuntu 22.04 上安装 Zabbix 7.0.0 时&#xff0c;如果图形界面&#xff08;如仪表盘、图表&#xff09;出现中文乱码&#xff0c;通常是因为缺少中文字体或字体配置不正确。以下是完整的解决方案&#xff1a; 1. 安装中文字体 安装 fonts-wqy-microhei&#xff08;文泉驿微…...

docker环境和dockerfile制作

docker 一、环境和安装 1、 docker安装 使用 root 权限登录 CentOS。确保 yum 包更新到最新sudo yum update卸载旧版本yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux …...

《经济日报》深度聚焦|珈和科技携手万果博览荟共筑智慧农业新示范高地 全链赋能蒲江茶果产业数字化转型升级

近日&#xff0c;《经济日报》深度聚焦报道了《珈和科技携手万果博览荟打造智慧农业新示范 双轮驱动绘就西南农业全链发展新篇章》。 作为国家级重点财经新闻媒体&#xff0c;《经济日报》对珈和科技与蒲江县人民政府战略合作签约&#xff0c;成立四川珈和科技子公司落地万果博…...

科技赋能·长效治理|无忧树建筑修缮渗漏水长效治理交流会圆满举行!

聚焦行业痛点&#xff0c;共话长效未来&#xff01;5月16日&#xff0c;由无忧树主办的主题为“科技赋能长效治理”的建筑修缮渗漏水长效治理技术交流会在上海圆满举行。来自全国的建筑企业代表、专家学者、技术精英齐聚一堂&#xff0c;共探渗漏治理前沿技术&#xff0c;见证科…...

文章记单词 | 第100篇(六级)

一&#xff0c;单词释义 immediate /ɪˈmiːdiət/ adj. 立即的&#xff1b;直接的&#xff1b;紧迫的hypothesis /haɪˈpɑːθəsɪs/ n. 假设&#xff1b;假说&#xff08;复数&#xff1a;hypotheses&#xff09;disregard /ˌdɪsrɪˈɡɑːrd/ v./n. 忽视&#xff1b…...

React表单开发的瑞士军刀:Formik与Yup实战指南

——揭秘高效表单开发的黄金公式 开篇&#xff1a;一场关于效率的革命 2023年某日凌晨&#xff0c;某互联网大厂会议室灯火通明。前端团队正为表单校验逻辑争论不休&#xff1a; “每次写表单都要重复处理触碰状态、错误消息、异步验证…” “受控组件状态管理太繁琐&#xf…...

瑞莎星睿 O6 (Radxa Orion O6)-ubuntu24.04-ROS2 运行深度估计模型

引言 由Radxa联合此芯科技与安谋科技打造的"星睿O6"迷你ITX主板堪称当前最受期待的开发板之一。该产品搭载的CIX P1&#xff08;CD8180&#xff09;12核Armv9处理器配合30TOPS算力的NPU和高性能GPU&#xff0c;结合最高64GB LPDDR内存&#xff0c;非常适合AI开发工作…...

【ubuntu】虚拟机连不上网,且网络中没有有线连接

错误图示 sudo gedit /etc/NetworkManager/NetworkManager.conf managedtruesudo gedit /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf 添加except:type:ethernet,然后重启 sudo service network-manager stop sudo rm /var/lib/NetworkManager/Networ…...

Ubuntu软件仓库与更新源配置指南

一、软件仓库基础知识 软件仓库的作用 Ubuntu 通过预设的软件仓库&#xff08;Repository&#xff09;提供软件包&#xff0c;包含系统核心组件、第三方应用及安全更新。仓库分为&#xff1a; Main&#xff1a;官方维护的自由开源软件 Universe&#xff1a;社区维护的自由开源…...

Docker run -v 的 rw 和 ro 模式_docker ro

一、前言 在使用 Docker 启动容器时&#xff0c;通常需要将宿主机的文件或目录挂载到容器中&#xff0c;以便于管理配置、持久化数据和调试日志。本篇博客将重点介绍 -v/--volume 参数的使用方式、挂载权限&#xff08;rw 与 ro&#xff09;的区别&#xff0c;以及如何通过 do…...

React+TypeScript多步骤表单:告别表单地狱的现代解决方案

开篇&#xff1a;深夜的表单困局 凌晨两点&#xff0c;键盘声在寂静的办公室回响。前端工程师小李盯着屏幕上的错误提示&#xff1a;“类型"FormData"上不存在属性’email’”。这已经是本周第三次因为字段名拼写错误导致的调试灾难。他揉着发酸的眼睛想&#xff1a…...

【工具使用】STM32CubeMX-USB配置-实现U盘功能

一、概述 无论是新手还是大佬&#xff0c;基于STM32单片机的开发&#xff0c;使用STM32CubeMX都是可以极大提升开发效率的&#xff0c;并且其界面化的开发&#xff0c;也大大降低了新手对STM32单片机的开发门槛。     本文主要讲述STM32芯片USB功能的配置及其相关知识。 二…...

【LUT技术专题】DnLUT代码解读

目录 原文概要 1. 训练 本文是对DnLUT技术的代码解读&#xff0c;原文解读请看DnLUT。 原文概要 DnLUT通过PCM模块和L型卷积&#xff0c;有效提升以往基于LUT方法降低色噪声的能力&#xff0c;用最小的存储量得到了同样的感受野范围&#xff0c;主要是2个创新点&#xff1…...

python宠物用品商城系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…...

2156. 查找给定哈希值的子串

给定整数 p 和 m &#xff0c;一个长度为 k 且下标从 0 开始的字符串 s 的哈希值按照如下函数计算&#xff1a; hash(s, p, m) (val(s[0]) * p0 val(s[1]) * p1 ... val(s[k-1]) * pk-1) mod m. 其中 val(s[i]) 表示 s[i] 在字母表中的下标&#xff0c;从 val(a) 1 到 v…...

Index-AniSora技术升级开源:动漫视频生成强化学习

B站升级动画视频生成模型Index-AniSora技术并开源&#xff0c;支持番剧、国创、漫改动画、VTuber、动画PV、鬼畜动画等多种二次元风格视频镜头一键生成&#xff01; 整个工作技术原理基于B站提出的 AniSora: Exploring the Frontiers of Animation Video Generation in the So…...

游戏引擎学习第297天:将实体分离到Z层中

回顾并为今天的内容做准备 昨天我们做了雾效混合&#xff08;fog blend&#xff09;和透明度混合&#xff08;alpha blending&#xff09;的尝试&#xff0c;现在正在进行渲染部分的深度&#xff08;Z&#xff09;清理工作。今天的重点是把“切片”&#xff08;slices&#xf…...

全局对比度调整

目录 一、全局对比度调整原理 二、饱和度保持 一、全局对比度调整原理 Figure1.2 展示了一幅全局对比度较低的图像及其亮度直方图。该直方图分布范围较窄,像素的强度仅集中在中间调区域,不存在明亮或深色的像素,因此图像中的细节难以区分,可用动态范围未得到有效利用。在动…...

Canvas SVG BpmnJS编辑器中Canvas与SVG职能详解

Canvas详解与常见API 一、Canvas基础 核心特性 • 像素级绘图&#xff1a;Canvas是基于位图的绘图技术&#xff0c;通过JavaScript操作像素实现图形渲染&#xff0c;适合动态、高性能场景&#xff08;如游戏、数据可视化&#xff09;。 • 即时模式&#xff1a;每次绘制需手动…...

【图像大模型】Stable Diffusion 3 Medium:多模态扩散模型的技术突破与实践指南

Stable Diffusion 3 Medium&#xff1a;多模态扩散模型的技术突破与实践指南 一、架构设计与技术演进1.1 核心架构革新1.2 关键技术突破1.2.1 整流流&#xff08;Rectified Flow&#xff09;1.2.2 动态掩码训练 二、系统架构解析2.1 完整推理流程2.2 性能对比 三、实战部署指南…...

PID项目---硬件设计

该项目是立创训练营项目&#xff0c;这些是我个人学习的记录&#xff0c;记得比较潦草 1.硬件-电路原理电赛-TI-基于MSPM0的简易PID项目_哔哩哔哩_bilibili 这个地方接地是静电的考量 这个保护二极管是为了在电源接反的时候保护电脑等设备 大电容的作用&#xff1a;当电机工作…...

渗透测试流程

2.1 信息收集 2.1.1 资产监控与架构分析 目标:明确目标范围(IP、域名、子公司资产),识别网络架构(云服务/CDN/反向代理)。 工具与技巧: 使用FOFA、Shodan搜索关联资产(如title="目标公司")。 通过nslookup或dig解析域名,确认真实IP是否隐藏于CDN…...

PCIe EP/RC 核心功能解释

1. Bar访问&#xff08;BAR Access&#xff09; BAR&#xff08;Base Address Register&#xff09; 是 PCIe 设备上的 地址窗口&#xff0c;用于主机与设备之间的 寄存器访问。功能&#xff1a; 主机通过 BAR 访问 EP 卡的 控制寄存器 或 数据缓冲区。每个 BAR 对应一段物理内…...

srs-7.0 支持obs推webrtc流

demo演示 官方教程: https://ossrs.net/lts/zh-cn/blog/Experience-Ultra-Low-Latency-Live-Streaming-with-OBS-WHIP 实现原理就是通过WHIP协议来传输 SDP信息 1、运行 ./objs/srs -c conf/rtc.conf 2、obs推流 3、web端播放webrtc流 打开web:ht...