【Linux篇】轻松搭建命名管道通信:客户端与服务器的互动无缝连接
从零开始:基于命名管道实现客户端与服务器的实时通信
- 一. 命名管道
- 1.1 基本概念
- 1.2 创建命名管道
- 1.2.1 创建方法
- 1.2.2 示例代码:
- 1.2.3 注意事项:
- 1.3 与匿名管道区别
- 1.4 打开原则
- 1.4.1 管道打开顺序
- 1.4.2 阻塞行为
- 1.4.3 管道的关闭
- 1.4.4 关闭读写端的规则
- 1.5 特点
- 二. 客户端与服务器的实现
- 2.1 简介
- 2.2 基本工作原理
- 2.3 实现通信
- 2.3.1 创建并设置命名管道
- 2.3.2 服务端实现(读取命名管道中的消息)
- 2.3.3 客户端实现(向命名管道写入消息)
- 2.3.4 定义常量和文件路径
- 2.3.5 总结:
- 三. 最后
命名管道是一种用于进程间通信(IPC)的机制,它通过特定的文件路径进行数据传输。客户端和服务器可以通过打开命名管道进行双向数据交换。服务器通常会创建一个命名管道并等待客户端连接,而客户端则需要访问这个管道进行通信。通信的过程基于FIFO(先进先出)原则,即先写入的数据会先被读取。通过这种方式,客户端和服务器能够实现异步通信,且数据传输简单高效。命名管道的优势在于它不需要显式的网络连接,使得在同一台机器上的进程间通信变得更加便捷。
💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力!
👍点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力!
🚀分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对Linux OS感兴趣的朋友,让我们一起进步!
一. 命名管道
1.1 基本概念
命名管道(Named Pipe)是一种用于进程间通信(IPC)的机制,它允许不同进程之间通过一个命名的通道交换数据。与匿名管道不同,命名管道是通过一个系统级的文件路径来标识和访问,允许不同的进程在不同的时间、甚至不同的机器上进行通信。
允许不具有血缘关系的进程之间进行通信,数据使用FIFO原则进行数据传输。
1.2 创建命名管道
1.2.1 创建方法
- 方法一:在命令行创建语法:
mkfifo filename
该指令将会创建命名管道filename(管道名称)。
- 方法二: 使用相关的函数创建,语法如下:
int mkfifo(const char *pathname, mode_t mode);
参数说明:
- pathname:这是要创建的命名管道的路径。这个路径需要是一个有效的文件路径,且在文件系统中应该是一个文件名。
- mode:指定管道的权限,类似于文件的权限。它通常是一个由数字组成的权限值,类似于文件的权限位,例如 S_IRUSR | S_IWUSR表示用户可读可写。权限的设置遵循Linux的文件权限规则。
返回值:
- 如果命名管道创建成功,返回 0。
- 如果失败,返回 -1 并设置 errno 以指示错误原因。
1.2.2 示例代码:
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>int main() {const char *fifo_path = "/tmp/my_fifo";//命名管道路径// 创建命名管道if (mkfifo(fifo_path, 0666) == -1) {perror("mkfifo failed");return 1;}printf("FIFO created successfully\n");//成功是打印该内容return 0;
}
在这个示例中,mkfifo 创建了一个名为 /tmp/my_fifo 的命名管道,权限设置为 0666,即文件的所有者、用户组和其他用户均可读写。
1.2.3 注意事项:
- 创建的管道必须由至少一个进程进行读写操作,否则可能会导致另一个进程调用 open() 时被阻塞,直到有进程打开该管道。
- 命名管道是一种特殊的文件,进程可以像普通文件一样对其进行读写,但它实际上是在进程之间传递数据的通道。
1.3 与匿名管道区别
特性 | 命名管道(Named Pipe) | 匿名管道(Anonymous Pipe) |
---|---|---|
标识方式 | 有文件路径,可以通过路径访问 | 没有文件路径,仅通过管道描述符访问 |
作用范围 | 支持不同进程间通信,甚至跨系统通信 | |
创建方式 | 使用mkfifo()创建 | 使用pipe()创建 |
生命周期 | 用户控制,管道文件存在于文件系统中 | 进程结束后自动销毁 |
阻塞行为 | 支持阻塞,写操作阻塞直到有读进程 | 支持阻塞,写操作阻塞直到有读进程 |
使用场景 | 不同进程间通信 | 父子进程之间通信 |
命名管道具有更强的灵活性,适用于跨进程、跨系统的复杂场景;而匿名管道则更简单,适用于父子进程间的简单数据传输。
- 如何理解用户控制:
"用户控制”则表示,管道的生命周期由用户管理,用户可以决定管道的创建、删除时机,并且管道不会自动销毁,直到用户删除它。
1.4 打开原则
1.4.1 管道打开顺序
- 写进程:可以在没有读进程存在的情况下打开管道,数据被放入管道缓冲区,直至有读进程打开并读取读取数据。如果写进程在管道缓冲区已满时继续写入,写端会发生阻塞,直到有数据可以读取。如果没有任何进程写入数据,读进程将永久阻塞。
- 读进程:写进程必须存在,没有时读端将发生阻塞,直至有数据可以读取。如果没有任何进程写入数据,读进程将会发生永久性阻塞。
1.4.2 阻塞行为
- 阻塞读取:如果读进程尝试从命名管道读取数据,但管道中没有数据,它会被阻塞,直到有写进程向管道写入数据。
- 阻塞写入:如果写进程向管道写入数据,而没有任何读进程准备好读取数据(或者管道缓冲区已满),写进程将被阻塞,直到有读进程读取数据或者管道中有空闲空间。
1.4.3 管道的关闭
- 进程关闭管道:进程在使用完管道后应该调用 close()来关闭管道。如果管道被完全关闭(即读写端都关闭),则其他试图读取或写入的进程会遇到 EOF 或 EPIPE 错误。
- 当管道中的数据被全部读取后,读进程会收到一个“文件结束标志(EOF)”。如果继续尝试读取,将会返回 0,表示没有更多数据可读取。
1.4.4 关闭读写端的规则
- 写端关闭时:如果写端关闭而读端仍在读取数据,读端会得到一个 EOF(文件结束符)信号,表明没有更多数据。
- 读端关闭时:如果读端关闭而写端继续写入数据,写进程会得到一个 EPIPE 错误,表明管道的另一端已经关闭。
1.5 特点
特点与匿名管道相似,唯一不同的是它可以让毫不相干的进程之间进行通信。
二. 客户端与服务器的实现
2.1 简介
用命名管道(Named Pipe)实现客户端与服务端通信是一种常见的进程间通信(IPC)方式。在这种模式下,服务端和客户端通过一个共享的命名管道进行数据交换。命名管道提供了一个通信通道,使得它们可以在不同的进程间进行双向数据传输。由于命名管道是一种通过文件系统实现的通信机制,因此客户端和服务端可以通过文件路径访问该管道。
2.2 基本工作原理
命名管道的工作原理基于先进先出规则,即数据写入管道的顺序会按照写入的顺序被读取。它在进程间提供一个缓冲区,允许数据从一个进程流向另一个进程。
在客户端和服务端通信中,服务端通常是管道的创建者,而客户端则是通过管道进行读取和写入操作。
2.3 实现通信
2.3.1 创建并设置命名管道
为什么要使用命名管道(FIFO)?
- 命名管道是通过文件系统提供的通信机制,不同的进程可以通过这个管道进行数据交换。
- 创建管道时,可以通过文件路径访问和管理管道,因此可以跨进程通信。
创建命名管道:
- 我们在 服务端 中创建命名管道。
int n = mkfifo(FIFO_FILE, 0666); // 创建管道,文件名为 FIFO_FILE
if (n != 0) {std::cerr << "mkdir fifo error" << std::endl;return 1;
}
2.3.2 服务端实现(读取命名管道中的消息)
- 服务端的主要功能:
服务端的工作是打开命名管道文件,读取客户端发送过来的消息并显示。
int fd = open(FIFO_FILE, O_RDONLY); // 以只读方式打开命名管道
if (fd < 0) {std::cerr << "open fifo error" << std::endl;return 2;
}
- 解释:
open() 用于打开已经创建的命名管道文件。这里我们以 O_RDONLY(只读)方式打开它,意味着服务端只是从管道中读取数据。
如果管道无法打开,输出错误信息并返回 2。
- 读取信息
char buffer[1024];
while (true) {int n = read(fd, buffer, sizeof(buffer) - 1); // 从管道读取数据if (n > 0) {buffer[n] = 0; // 确保字符串结束std::cout << "client say# " << buffer << std::endl; // 打印客户端消息}
}
- 解释:
read() 函数从命名管道中读取数据,直到管道中没有数据可读。buffer 存储读取到的数据。
如果读取成功,将数据输出到控制台。
通过 n 判断读取的字节数,如果大于 0,说明读取成功。
- 关闭管道
close(fd); // 关闭管道
- 解释:
完成数据读取后,关闭管道文件描述符。
2.3.3 客户端实现(向命名管道写入消息)
- 客户端的主要功能:
客户端需要向命名管道写入消息。在每次输入后,客户端会将用户输入的消息写入管道,供服务端读取。
int fd = open(FIFO_FILE, O_WRONLY); // 以只写方式打开命名管道
if (fd < 0) {std::cerr << "open fifo error" << std::endl;return 2;
}
- 解释:
open() 用于打开管道文件,O_WRONLY 表示只写打开管道。客户端仅通过该管道写入数据。
如果打开失败,输出错误并返回 2。
发送信息:
while (true) {std::cout << "Please Enter# ";std::string message;std::cin >> message; // 从用户输入读取消息int n = write(fd, message.c_str(), message.size()); // 将消息写入管道if (n > 0) {// 写入成功}
}
- 解释:
std::cin >> message 用于从用户输入获取消息。
write() 用于将消息写入管道。如果消息成功写入,n 返回写入的字节数。
关闭管道:
close(fd); // 关闭管道
- 解释:
客户端发送完消息后,关闭管道。
2.3.4 定义常量和文件路径
#pragma once
#define FIFO_FILE "fifo" // 定义命名管道的文件路径
- 解释:
在 common.hpp 文件中定义一个宏 FIFO_FILE,用于存储命名管道的路径。在客户端和服务端中都使用这个路径,确保一致性。
2.3.5 总结:
- 服务端:创建并打开命名管道,通过 read() 从管道读取客户端发送的消息,并输出到控制台。
- 客户端:打开命名管道,通过 write() 将用户输入的消息发送到管道。
- 进程之间通过 命名管道(FIFO)共享数据,命名管道提供了一个简单的方式来进行进程间通信。
- 客户端和服务端各自控制着管道的一端,数据的传递是同步的,即写入和读取是交替进行的。
三. 最后
本文介绍了基于命名管道(FIFO)实现客户端与服务器实时通信的过程。命名管道是一种通过文件路径进行进程间通信的机制,支持不同进程之间的数据传输,基于FIFO(先进先出)原则。通过 mkfifo() 函数可以创建命名管道,客户端和服务端通过管道文件进行数据交换。服务端创建并打开管道以读取数据,客户端通过管道向服务端写入消息。命名管道的优势在于不需要网络连接,适用于同一台机器上的进程通信。通过合适的同步与阻塞机制,客户端与服务端能够顺利实现数据传输。
完整代码(如下):
server.cc
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <cstring>
#include <unistd.h>
#include "common.hpp"int main()
{umask(0);int n = mkfifo(FIFO_FILE, 0666);if(n != 0){std::cerr << "mkdir fifo error" << std::endl;return 1;}int fd = open(FIFO_FILE,O_RDONLY);if(fd < 0){std::cerr << "open fifo error" << std::endl;return 2;}char buffer[1024];while(true){int n = read(fd,buffer,sizeof(buffer) -1);if(n > 0){buffer[n] = 0;std::cout << "client say# " << buffer << std::endl;}}close(fd);return 0;
}
client.cc
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <cstring>
#include <unistd.h>
#include "common.hpp"int main()
{int fd = open(FIFO_FILE,O_WRONLY);if(fd < 0){std::cerr << "open fifo error" << std::endl;return 2;}while(true){std::cout << "Please Enter# ";std::string message;std::cin >> message;int n = write(fd, message.c_str(),message.size());if(n > 0){}}close(fd);return 0;
}
comm.hpp
#pragma once#define FIFO_FILE "fifo"
makefile
.PHONY:all
all:client server
client:client.ccg++ -o $@ $^ -std=c++11
server:server.ccg++ -o $@ $^ -std=c++11.PHONY:clean
clean:rm -f client server
上述代码可以实现两者进行通信。
演示图片(如下图):
相关文章:
【Linux篇】轻松搭建命名管道通信:客户端与服务器的互动无缝连接
从零开始:基于命名管道实现客户端与服务器的实时通信 一. 命名管道1.1 基本概念1.2 创建命名管道1.2.1 创建方法1.2.2 示例代码:1.2.3 注意事项:1.3 与匿名管道区别 1.4 打开原则1.4.1 管道打开顺序1.4.2 阻塞行为1.4.3 管道的关闭1.4.4 关闭…...
快充协议芯片XSP04D支持使用一个Type-C与电脑传输数据和快充取电功能
快充是由充电器端的充电协议和设备端的取电协议进行握手通讯进行协议识别来完成的,当充电器端的充电协议和设备端的取电协议握手成功后,设备会向充电器发送电压请求,充电器会根据设备的需求发送合适的电压给设备快速供电。 设备如何选择快充…...
MySQL的窗口函数(Window Functions)
一、窗口函数核心概念 窗口(Window) 窗口是数据行的集合,由OVER()子句定义。它决定了函数计算的“数据范围”,可以是一个分区的全部行、当前行前后的行,或动态变化的子集。 语法结构 SELECT window_f…...
一个很简单的机器学习任务
一个很简单的机器学习任务 前言 基于线上colab做的一个简单的案例,应用了线性回归算法,预测了大概加州3000多地区的房价中位数 过程 先导入了Pandas,这是一个常见的Python数据处理函数库 用Pandas的read_csv函数把网上一个共享数据集&…...
ORION:通过视觉-语言指令动作生成的一个整体端到端自动驾驶框架
25年3月来自华中科技和小米电动汽车的论文“ORION: A Holistic End-to-End Autonomous Driving Framework by Vision-Language Instructed Action Generation”。 由于因果推理能力有限,端到端 (E2E) 自动驾驶方法仍然难以在交互式闭环评估中做出正确决策。当前的方…...
python全栈-flask
python全栈-flask 文章目录 入门上手hello worldflask运行方式测试路由with app.test_request_context():debug模式配置flask参数动态路由数据类型自定义转换器to_pythonPostMan(API测试查询参数的获取请求体参数上传文件其它参数url_for 函数重定向响应内容自定义响…...
Unity中的数字孪生项目:两种输入方式对观察物体的实现
在数字孪生项目中,精确的相机控制至关重要。相机不仅需要灵活地跟随目标,还要能够平滑地旋转和缩放,以便观察和分析物体的各个细节。今天,我将通过 TouchControlCamera 和 CameraRotate 两个脚本,展示如何实现一个适用…...
ECharts散点图-散点图14,附视频讲解与代码下载
引言: ECharts散点图是一种常见的数据可视化图表类型,它通过在二维坐标系或其它坐标系中绘制散乱的点来展示数据之间的关系。本文将详细介绍如何使用ECharts库实现一个散点图,包括图表效果预览、视频讲解及代码下载,让你轻松掌握…...
【教程】Digispark实现串口通信
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 没想到这么老,很多代码都不能用,修了好久。。。 TinySoftwareSerial.cpp #include <stdlib.h> #include <stdio.h&g…...
GPT-4.1 开启智能时代新纪元
GPT-4.1 全解析:开启智能时代新纪元(含费用详解) 2025年4月,OpenAI 正式推出全新一代语言模型——GPT-4.1 系列,包括 GPT-4.1、GPT-4.1 Mini 和 GPT-4.1 Nano。相比以往模型,它在代码生成、指令理解、长文本…...
4.21 spark和hadoop的区别与联系
一、Hadoop 1. 定义 Hadoop是一个由Apache基金会开发的分布式系统基础架构。它最初是为了解决大规模数据存储和处理的问题而设计的。Hadoop的核心组件包括HDFS(Hadoop Distributed File System)和MapReduce。 2. HDFS(Hadoop Distributed Fi…...
Nacos 客户端 SDK 的核心功能是什么?是如何与服务端通信的?
Nacos 客户端 SDK 的核心功能 Nacos 客户端 SDK 是应用程序集成 Nacos 能力的桥梁,它封装了与 Nacos 服务端交互的复杂性,为开发者提供了简单易用的 API。其核心功能主要围绕两大方面:服务发现 和 配置管理。 服务发现 (Service Discovery) …...
servlet-保存作用域
保存作用域 保存作用域:原始情况下,保存作用域我们有四个:page(一般不用了) 、request(一般请求响应范围)、session(一次会话范围)、application(整个应用程序范围)1)request:一般请求响应范围…...
从规则到大模型:知识图谱信息抽取实体NER与关系RE任务近10年演进发展详解
摘要: 本文回顾了关系抽取与实体抽取领域的经典与新兴模型,清晰地梳理了它们的出现时间与核心创新,并给出在 2025 年不同资源与场景下的最佳实践推荐。文章引用了 BiLSTM‑CRF、BiLSTM‑CNN‑CRF、SpanBERT、LUKE、KnowBERT、CasRel、REBEL、…...
【自然语言处理与大模型】模型压缩技术之蒸馏
知识蒸馏是一种模型压缩技术,主要用于将大型模型(教师模型)的知识转移到更小的模型(学生模型)中。在大语言模型领域,这一技术特别重要。 知识蒸馏的核心思想是利用教师模型的输出作为软标签(sof…...
yum如果备份已经安装的软件?
在 CentOS 系统中,你可以通过以下步骤将 yum 下载的组件打包备份到本地: 方法 1:使用 yumdownloader 直接下载 RPM 包 1. 安装 yum-utils 工具 yum install -y yum-utils2. 下载指定软件包及其依赖 yumdownloader --resolve <package-n…...
室外摄像头异常自检指南+视频监控系统EasyCVR视频质量诊断黑科技
室外监控摄像头在安防监控系统运行中,常出现连接不畅、设备互认失败等问题。今天我们来介绍两类安防监控摄像头的典型问题及排查步骤。 问题1:同品牌新摄像头无法被老录像机识别 排查步骤: 1)供电检查 确认摄像头供电线路连接正…...
从本地存档到协作开发的Git简单使用
概念 工作区 : 在本地实际进行文件操作的目录 .暂存区 : 类似于缓冲区 , 用于记录准备进行下一次提交的内容 .本地仓库 : 储存在本地的完整版本库 , 包含项目的提交历史 , 分支信息和标签等 .远程仓库 : 部署在远程服务器的版本库 , 通常用于协作开发 . 文件状态 Untracked …...
在 Android 中实现通话录音
在 Android 中实现通话录音需要处理系统权限、通话状态监听和音频录制等关键步骤。以下是详细实现代码及注释,注意不同 Android 版本和厂商设备的兼容性问题: 1. 添加权限声明(AndroidManifest.xml) <!-- 录制音频权限 -->…...
系统分析师知识点:访问控制模型OBAC、RBAC、TBAC与ABAC的对比与应用
在信息安全领域,访问控制是确保数据和资源安全的关键技术。随着信息系统复杂度的提高,访问控制技术也在不断演进,从早期简单的访问控制列表(ACL)发展到如今多种精细化的控制模型。本文将深入剖析四种主流的访问控制模型:基于对象的…...
网络原理(TCP协议—协议格式,性质(上),状态)
目录 1.TCP协议段格式。 2.TCP协议传输时候的性质。 2.1确认应答。 2.2超时重传。 2.3连接管理。 2.3.1 三次握手。 2.3.2四次挥手。 3.TCP常见的状态。 1.TCP协议段格式。 TCP协议段是由首部和数据两部分构成的。首部包含了TCP通信所需要的各种控制信息,而…...
用全新发布的ChatGPT-o3搜文献写综述、专业审稿、降重润色,四个步骤轻松搞定全部论文难题!
今天和大家聊聊OpenAI近期发布的o系列模型中的两个大成果:o3和o4-mini,这个系列的模型最大特点是经过训练,会在响应之前进行更长时间的思考,给出更深入的回答。 下面文章七哥会为大家深度讲解o3模型在学术研究和论文写作方面的四大优势,并附上实用有效的使用技巧和步骤供…...
多路由器通过RIP动态路由实现通讯(单臂路由)
多路由器通过RIP动态路由实现通讯(单臂路由) R1(开启端口并配置IP) Router>en Router#conf t Router(config)#int g0/0 Router(config-if)#no shu Router(config-if)#no shutdown Router(config-if)#ip add 192.168.10.254 255.255.255.0 Router(c…...
分数线降低,25西电马克思主义学院(考研录取情况)
1、马克思主义学院各个方向 2、马克思主义学院近三年复试分数线对比 学长、学姐分析 由表可看出: 1、马克思主义理论25年相较于24年下降10分,为355分 3、25vs24推免/统招人数对比 学长、学姐分析 由表可看出: 1、 马克思主义学院25年共接…...
反转字符串
344. 反转字符串 题目 思路 双指针 设 s 长度为 n。反转可以看成是交换 s[0] 和 s[n−1],交换 s[1] 和 s[n−2],交换 s[2] 和 s[n−3],依此类推。 代码 class Solution:def reverseString(self, s: List[str]) -> None:""&q…...
乾元通渠道商中标舟山市自然灾害应急能力提升工程基层防灾项目
近日,乾元通渠道商中标舟山市自然灾害应急能力提升工程基层防灾项目(结余资金)装备采购项目,乾元通作为设备厂家,为项目提供通信指挥类装备(多链路聚合设备)QYT-X1。 青岛乾元通数码科技有限公司…...
信号调制与解调技术基础解析
调制解调技术是通信系统中实现基带信号与高频载波信号相互转换的主要技术,通过调整信号特性使其适应不同信道环境,保障信息传输的效率和可靠性。 调制与解调的基本概念 调制(Modulation) 将低频基带信号(如语音或数…...
多源异构网络安全数据(CAPEC、CPE、CVE、CVSS、CWE)的作用、数据内容及其相互联系的详细分析
1. CWE(Common Weakness Enumeration) 作用:CWE 是常见软件和硬件安全弱点的分类列表,用于描述漏洞的根本原因(如代码缺陷、逻辑错误等),为漏洞的根源分析提供框架。数据内容: 弱点…...
02_Flask是什么?
一、视频教程 02_Flask是什么 二、Flask简介 Flask 框架诞生于2010 年,是由 Armin 使用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架。Armin 是 Python 编程语言的核心开发者之一,同时也是 Flask 项目的主要贡献者。 Flask主要依赖于两个核…...
突破网页数据集获取难题:Web Unlocker API 助力 AI 训练与微调数据集全方位解决方案
突破网页数据集获取难题:Web Unlocker API 助力 AI 训练与微调数据集全方位解决方案 背景 随着AI技术的飞速发展,诸如DeepSeek R1、千问QWQ32、文小言、元宝等AI大模型迅速崛起。在AI大模型训练和微调、AI知识库建设中,数据集的获取已成为不…...
Spark-SQL与Hive集成及数据分析实践
一、Spark-SQL连接Hive的配置 Spark-SQL支持与Hive无缝集成,可通过以下方式操作Hive: 1. 内嵌Hive:无需额外配置,直接使用,但生产环境不推荐。 2. 外部Hive: 将hive-site.xml、core-site.xml、hdfs-site…...
CI/CD
CI/CD 是一种用于软件开发和交付的实践方法,由持续集成(Continuous Integration)、持续交付(Continuous Delivery)和持续部署(Continuous Deployment)三个关键环节组成,以下是具体介…...
【橘子大模型】Tools/Function call
一、简介 截止目前,我们对大模型的使用模式仅仅是简单的你问他答。即便是拥有rag,也只是让大模型的回答更加丰富。但是大模型目前为止并没有对外操作的能力,他只是局限于他自己的知识库。 举个例子,到今天4.21为止,你…...
解决Mac 安装 PyICU 依赖失败
失败日志: 解决办法 1、使用 homebrew 安装相关依赖 brew install icu4c 安装完成后,设置环境变量 echo export PATH"/opt/homebrew/opt/icu4c77/bin:$PATH" >> ~/.zshrcecho export PATH"/opt/homebrew/opt/icu4c77/sbin:$PATH…...
Kafka 生产者的幂等性与事务特性详解
在分布式消息系统中,消息的可靠性传输是一个核心问题。Kafka 通过幂等性(Idempotence)和事务(Transaction)两个重要特性来保证消息传输的可靠性。幂等性确保在生产者重试发送消息的情况下,不会在 Broker 端…...
ubuntu--汉字、中文输入
两种输入框架的安装 ibus 链接 (这种方式安装的中文输入法不是很智能,不好用)。 Fcitx 链接这种输入法要好用些。 简体中文检查 fcitx下载和配置 注意:第一次打开fcitx-config-qt或者fcitx configuration可能没有“简体中文”,需要把勾…...
LabVIEW 开发中数据滤波方式的选择
在 LabVIEW 数据处理开发中,滤波是去除噪声、提取有效信号的关键环节。不同的信号特性和应用场景需要匹配特定的滤波方法。本文结合典型工程案例,详细解析常用滤波方式的技术特点、适用场景及选型策略,为开发者提供系统性参考。 一、常用…...
【图像轮廓特征查找】图像处理(OpenCV) -part8
17 图像轮廓特征查找 图像轮廓特征查找其实就是他的外接轮廓。 应用: 图像分割 形状分析 物体检测与识别 根据轮廓点进行,所以要先找到轮廓。 先灰度化、二值化。目标物体白色,非目标物体黑色,选择合适的儿值化方式。 有了轮…...
丝杆升降机蜗轮蜗杆加工工艺深度解析:从选材到制造的全流程技术要点
在机械传动领域,丝杆升降机凭借其高精度、大负载等优势,广泛应用于自动化设备、精密仪器等众多场景。而蜗轮蜗杆作为丝杆升降机的核心传动部件,其加工工艺的优劣直接决定了设备的传动效率、使用寿命及稳定性。本文将深入剖析丝杆升降机蜗轮蜗…...
git远程分支重命名(纯代码操作)
目录 步骤 1:重命名本地分支 步骤 2:推送新分支到远程 简单讲讲: 2.1.-u 和 --set-upstream 的区别 2.2. 为什么需要设置上游(upstream)? 示例对比: 2.3. 如何验证是否设置成功ÿ…...
《AI大模型应知应会100篇》第31篇:大模型重塑教育:从智能助教到学习革命的实践探索
第31篇:大模型重塑教育:从智能助教到学习革命的实践探索 摘要 当北京大学的AI助教在凌晨三点解答学生微积分难题,当Khan Academy的AI导师为每个学生定制专属学习路径,我们正见证教育史上最具颠覆性的技术变革。本文通过真实教育…...
安装Github软件详细流程,win10系统从配置git到安装软件详解,以及github软件整合包制作方法(
win10系统部署安装开源ai必备 一、安装git应用程序(用来下来github软件) 官网下载git的exe可执行文件,Git - Downloads 或者这里下夸克网盘分享 运行git应用程序,一路’Next’到底即可。 配置安装路径 此时如果直接运行git命…...
重构・协同・共生:传统代理渠道数字化融合全链路解决方案
当 90 后经销商开始用直播卖家电,当药品流向数据在区块链上实时流转,传统代理渠道正在经历一场「数字觉醒」。面对流量碎片化、运营低效化的行业痛点,如何让扎根线下数十年的渠道网络,在数字化平台上焕发新生?蚓链提炼…...
智驱未来:AI大模型重构数据治理新范式
第一章 数据治理的进化之路 1.1 传统数据治理的困境 在制造业巨头西门子的案例中,其全球200个工厂每天产生1.2PB工业数据,传统人工清洗需要300名工程师耗时72小时完成,错误率高达15%。数据孤岛问题导致供应链决策延迟平均达48小时。 1.2 A…...
信息收集之hack用的网络空间搜索引擎
目录 1. Shodan 2. Censys 3. ZoomEye 4. BinaryEdge 5. Onyphe 6. LeakIX 7. GreyNoise 8. PulseDive 9. Spyse 10. Intrigue 11. FOFA (Finger Of Find Anything) 12. 🔍 钟馗之眼 (ZoomEye) 总结 对于黑客、网络安全专家和白帽子工程师来说…...
青少年编程与数学 02-018 C++数据结构与算法 01课题、算法
青少年编程与数学 02-018 C数据结构与算法 01课题、算法 一、算法的定义二、算法的设计方法1. 分治法2. 动态规划法3. 贪心算法4. 回溯法5. 迭代法6. 递归法7. 枚举法8. 分支定界法 三、算法的描述方法1. **自然语言描述**2. **流程图描述**3. **伪代码描述**4. **程序设计语言…...
LangChain、LlamaIndex 和 ChatGPT 的详细对比分析及总结表格
以下是 LangChain、LlamaIndex 和 ChatGPT 的详细对比分析及总结表格: 1. 核心功能对比 工具核心功能LangChain框架,用于构建端到端的 LLM 应用程序,支持 prompt 工程、模型调用、数据集成、工具链开发。LlamaIndex文档处理工具,…...
基于单片机的BMS热管理功能设计
标题:基于单片机的BMS热管理功能设计 内容:1.摘要 摘要:在电动汽车和储能系统中,电池管理系统(BMS)的热管理功能至关重要,它直接影响电池的性能、寿命和安全性。本文的目的是设计一种基于单片机的BMS热管理功能。采用…...
数字虹膜:无网时代的视觉密语 | 讨论
引言:当网络成为枷锁 在断网即失联的当下,我们是否过度依赖脆弱的网络线缆?当两台孤立设备急需交换数据,传统方案或受限于物理介质,或暴露于无线信号被劫持的风险。有没有可能绕过所有中间节点,让数据像光线…...
Kubernetes相关的名词解释Container(16)
什么是Container? 在 Kubernetes 中,Container(容器) 是一个核心概念,你可以将镜像(Image)类比为程序的“源代码”,而容器是这段“代码”运行时的进程。例如,一个 nginx…...