【Linux】深入理解Linux文件系统:从C接口到内核设计哲学
文章目录
- 前言
- 一、C语言中的文件接口
- 1. 文件指针(句柄)FILE*
- 以写方式打开文件,若文件不存在会新建一个文件
- W写入方式,在==打开文件之前==都会将文件内容全部清空
- 追加写方式,其用法与写方法一致,不同在于a方法可以在文件结尾写入
- 二、认识文件系统调用
- Linux下的系统调用open()
- 第一个参数为文件路径
- 第二个参数为操作文件的方式
- 第三个可选参数是更改创建文件的默认权限:
- 三、访问文件的本质
- 四、重定向与缓冲区
- 自定义重定向系统调用接口dup2
- 再谈“一切皆文件”
- 1. 外设设备与文件系统的关系
- 2. 扩展思想:
- 总结
前言
在计算机系统中,文件由内容数据和元数据属性共同构成。文件的完整生命周期分为两个阶段:
文件状态 | 存储位置 | 管理方式 |
---|---|---|
未打开文件 | 磁盘存储介质 | 文件系统通过inode管理 |
已打开文件 | 内存 | 内核通过file结构体管理 |
- 所有文件操作本质上都是进程与文件系统的交互
- 打开文件需要将文件属性加载到内存
- 文件内容采用按需加载策略(延迟加载)
研究文件系统本质是研究进程和文件之间的关系(文件是由进程打开的);未打开的文件存在磁盘上(存储介质),文件要被打开(属性)必须先要加载到内存;
一、C语言中的文件接口
基本输入输出 stdio.h
访问磁盘的过程称之为IO的过程,
1. 文件指针(句柄)FILE*
//C标准库通过FILE结构体封装文件描述符FILE *fopen(const char *path, const char *mode)
// mode参数决定了你的访问权限
mode | 说明 | 特性 |
---|---|---|
“w” | 写模式(清空文件) | 文件不存在时创建 |
“a” | 追加模式 | 保留原内容,末尾写入 |
“r” | 读写模式 | 文件必须存在 |
以写方式打开文件,若文件不存在会新建一个文件
若没有指定路径,程序会在默认当前路径下创建,当前路径指的是进程的当前路径(使用ls /proc/[pid]
查看到当前进程的cwd)。
同样的,修改当前进程的工作目录就可以改变创建文件的默认路径。
chdir("home/ys") //修改进程工作路径为home/ys
W写入方式,在打开文件之前都会将文件内容全部清空
上一个程序疑问:strlen要不要+1?
我们知道写入字符串时需要将\0也写入,我们试验之后发现文本中多了@^这样的乱码,推测这就是\0,只不过vim文本编辑器将其解释成了乱码符号。结论是strlen不需要+1,文件系统没有规定字符串必须以\0结尾。
追加写方式,其用法与写方法一致,不同在于a方法可以在文件结尾写入
二、认识文件系统调用
c语言程序在启动时,会默认打开三个标准输入输出流文件:
stdin:键盘设备
stdout:显示器文件
stderr:显示器文件
文件其实是在磁盘上的,由于磁盘是外部设备,访问文件实际上是访问磁盘这样的硬件。不同的语言有不同的文件操作方式,但在底层用的是都是一样的实现方式——都需要调用系统接口open、read、write。
库函数(fopen,printf,fscanf等)访问硬件设备一定会通过系统调用来访问。
Linux下的系统调用open()
第一个参数为文件路径
- 若pathname以路径的方式给出,则当需要创建该文件时,就在pathname路径下进行创建。
- 若pathname以文件名的方式给出,则当需要创建该文件时,默认在当前路径下进行创建。(注意当前路径的含义)
第二个参数为操作文件的方式
方式 | 含义 |
---|---|
O_RDONLY | 以只读的方式打开文件 |
O_WRNOLY | 以只写的方式打开文件 |
O_APPEND | 以追加的方式打开文件 |
O_RDWR | 以读写的方式打开文件 |
O_CREAT | 当目标文件不存在时,创建文件 |
1. O_WRONLY是写方式,但是它并不会新建文件
2. O_CREAT打开文件时清空文件
3. O_APPEND 追加写选项
写入:
const char* message = "hello";
write(fd,message,strlen(message));
//write并不会对文件进行清空式写入。
int fd = open("log.txt",O_WRONLY|O_CREAT|O_APPEND,0666); //追加
write(fd,message,strlen(message),);
第三个可选参数是更改创建文件的默认权限:
//eg:
int fd = open("log.txt",O_WRONLY|O_CREAT);
创建权限错误,所以新建文件时需要告诉接口权限是什么。
int fd = open("log.txt",O_WRONLY|O_CREAT,0666);
这里创建出来的并不是666而是664,应该要想到之前学到的权限掩码(0002)的知识!
比特位级别的传参方式原理:
使用位图的方式,一次向操作系统传递多个标志位
三、访问文件的本质
可以将其类比系统管理进程(struct_task),Linux系统中一切皆文件,因此管理进程势必要通过先描述再组织的方法进行。要描述一个被打开的文件(struct_file),往往需要包含文件路径、文件基本属性(权限、大小、读写位置、访问用户的信息等)、文件的内核缓冲区信息、下一个struct_file的指针。
一个进程可能会打开多个文件,那么进程与文件之间又是如何关联的?(1:n)
进程PCB中会存在一个结构体指针struct files_struct *files
指向了一个结构体,该结构体存放了一个存放各种文件PCB指针的数组;因为是数组,所以这也解释了为什么open接口返回的是int类型的值了,进程根据这个下标就可以访问对应文件。
如果尝试打印一下返回值,发现文件描述符默认是从3开始的,那么0,1,2是什么文件呢?那就是标准输入输出错误流了!(stdin \ stdout \stderr
)
int fd = open("demo.txt",O_WRONLY |O_CREAT,0666);
cout << fd << endl; //3cout << stdin->_fileno << endl;//0
cout << stdout->_fileno << endl;//1
cout << stderr->_fileno << endl;//2
既然一切皆文件,那么输出流也是文件,因此我们可以使用以下代码向标准输出流文件中写入message信息:
const char* message = "hello";
write(1,message,strlen(message));// 1 就是标准输出流stdout
从标准输入流文件中读取buffer大小的字符放在buffer[1024]数组中 :
char buffer[1024];
read(0,buffer,sizeof(buffer));
printf("echo: %s\n",buffer);
四、重定向与缓冲区
文件描述符对应的分配规则是什么?
从0下标开始,寻找没有被使用的数组位置,它的下标就是新文件的文件描述符值。
假设我们有一个空文件log.txt,有如下代码,含义是将msg中的strlen长度的数据输出到显示器。
const char* msg = "hello linux\n";
write(1,msg,strlen(msg));
但如果先关闭了1描述符(即关闭标准输出流),除了显示器无法显示外
close(1);
int fd = open("log.txt", O_RDONLY | O_CREAT, 0666);//1
const char* msg = "hello linux\n";
write(1,msg,strlen(msg));//此时写入的就是1号文件描述符,即log.txt 文件
log.txt中居然存有数据。
这一工作,称为输出重定向。根据上面的知识可以意识到关闭了1描述符后,那么这里就是空着的,当使用open接口新建log.txt时,根据文件描述符分配规则,自然1号位就成为了log.txt的fd描述符,所以将本来要写入stdout的数据写入到了log.txt中。
自定义重定向系统调用接口dup2
int dup2(int oldfd,int newfd)
把oldfd复制到newfd
//oldfd 相当于 原本的 3 描述符
//newfd 相当于 原本的 1 描述符int fd = open("log.txt", O_WRONLY|O_CREAT, 0666);
dup2(fd, 1);
这里要注意的是,重定向中的拷贝,不是将文件描述符表中的下标进行拷贝,而是对下标处的内容(文件结构体指针)进行拷贝!
使用dup2在打开文件log.txt后,进行了输出重定向,将原本输出到显示器的内容写入到了log.txt文件中。再次更改代码open的宏参数(O_TRUNC -> O_APPEND),就成为了追加重定向操作。结果如下所示:
同样的,可以修改代码让其重定向标准输入流至文件(默认read从stdin文件读数据,重定向后,从log.txt文件中读)。这一过程称为输入重定向。
以上是使用dup2重定向系统调用函数write、read,前面提到c语言printf、fprintf底层也是这样的文件描述符表的结构,那是否可以控制c语言中的输入输出呢?
dup2(fd,1);
printf("hello printf\n");
fprintf(stdout,"hello printf\n");
回想之前的章节介绍到echo指令,可以进行输出重定向,cat指令可以进行输入重定向
echo "hello" > log.txt //输出重定向
cat < log.txt //输入重定向
echo "hello" >> log.txt //追加重定向
进程的替换不会影响文件的访问(包括重定向操作)——复习进程替换
stdout与stderr都是可以向显示器打印,为什么要有2?他们俩的区别是什么?
有如下代码,表示将字符串分别输出到1(标准输出流)和2(标准错误流)中。
$ ./mytest 1>normal.log 2>err.log
//将stdout的数据重定向至normal.log
//将stderr的数据重定向至err.log
实际上,1和2是相同的实现方式,只不过在使用中,相较于正常结果而言,更关注的是它的错误信息,而正常运行的信息往往很多,不便错误的筛查与纠正。因此,为了将错误信息分离出来,才有了标准错误流。
一个衍生用法:
$ ./mytest >normal.log 2>&1
再谈“一切皆文件”
1. 外设设备与文件系统的关系
在这之前我们知道:所有操作计算机的动作都是由进程执行的,包括文件的访问,每一种外设都要有描述他们的结构体对象(struct_dev)。
此外,每一种外设都有其相独特的读写方法,纵然每个外设对应的访问实现方式不同(各家外设设备驱动的不同),而对于操作系统来看,这些外设无非都是一些需要进行读写的文件,而能够直接进行文件访问读写的就是进程(open接口),打开新的文件就会创建一个新的struct_file,这个结构体是不是很熟悉?在这个结构体中,就存在着能够指向该文件具体实现自身读写行为的指针(struct fils_operations*),例如(指向了不同磁盘的读写方法,不同键盘的读写方法)。
- 在Linux中,将struct_file这一层的逻辑关系称为虚拟文件系统(VFS)。
外设差异化被封装在驱动中:不同厂商的驱动实现自己的读写逻辑(如
razer_keyboard_read
和logitech_keyboard_read
),但必须遵循操作系统定义的接口。
操作系统通过抽象层统一接口:上层应用只需调用read()、write()
等标准接口,无需关心底层是罗技还是雷蛇设备。
2. 扩展思想:
这种设计模式与 面向对象编程中的多态性高度相似:
基类(抽象接口) :操作系统定义的设备驱动接口(如file_operations)。
派生类(具体实现) :厂商驱动的读写函数(如雷蛇、罗技的实现)。
运行时多态 :通过函数指针动态绑定到具体实现。
通过这种机制,操作系统实现了外设的 “高内聚、低耦合”
,使得硬件厂商可以自由创新,同时保持软件生态的兼容性。
总结
👍 感谢各位大佬观看。如果本文有帮助,请点赞收藏支持~
相关文章:
【Linux】深入理解Linux文件系统:从C接口到内核设计哲学
文章目录 前言一、C语言中的文件接口1. 文件指针(句柄)FILE*以写方式打开文件,若文件不存在会新建一个文件W写入方式,在打开文件之前都会将文件内容全部清空追加写方式,其用法与写方法一致,不同在于a方法可…...
前端零基础入门到上班:Day7——表单系统实战全解析
🧩前端零基础入门到上班:Day7——表单系统实战全解析 ✅ 目标:不仅掌握 HTML 表单标签,更深入理解其在实战中的作用、验证方式、美化技巧与 JS 联动,为后续接入 Vue、后端接口打下坚实基础。 🌟 一、HTML 表…...
阀门轴承电动车工件一键精修软件
若需定制开发“ComfyUI意见精修软件” 技术栈建议: 前端:React/Vue Figma插件API(直接读取设计稿)。 后端:Node.js/Python NLP库(spaCy/NLTK)。 数据库:MongoDB(存储…...
【疑难杂症】【VS Code】VS Code连接不上远程服务器
【疑难杂症】【VS Code】VS Code连接不上远程服务器 经过多轮资料查询和测试,这种时候有三种可能: 可能原因1:服务器磁盘空间不足,无法创建服务器连接。 解决方案:清理磁盘空间,尤其是/tmp文件所在的磁盘。…...
Word 中“母版页”的等效机制
Word 和 PowerPoint 不太一样——**Word 实际上没有像 PowerPoint 那样的“母版页(Master Page)”**功能。但它有1个和“母版页”功能类似的东西,可能造成你看到的“校徽自动出现在每一页”的现象: ✅ Word 中“母版页”的等效机制…...
大模型时代:AI应用的变革与挑战
最近研学过程中发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面开始对正文内容的…...
C++ (菱形继承,通用接口 ,多态介绍)
菱形继承 class A{public :int a;};class B:public A{};class C:public A{};class D:public B,public C{public:void function(){a200;} };int main(){D object;// object.a100; 如果如此使用会产生报错 会导致一个成员在类D中出现两次,产生歧义,浪…...
vue3+vite 实现.env全局配置
首先创建.env文件 VUE_APP_BASE_APIhttp://127.0.0.1/dev-api 然后引入依赖: pnpm install dotenv --save-dev 引入完成后,在vite.config.js配置文件内加入以下内容: const env dotenv.config({ path: ./.env }).parsed define: { // 将…...
4.18日学习--引用
引用是变量的别名,它为已存在的变量提供了一个新的名称,对引用的操作实际上就是对其所引用变量的操作。引用在定义时必须初始化,且一旦初始化后就不能再引用其他变量。 #include <iostream> using namespace std;//引用做函数的返回值…...
poj1067 取石子游戏 威佐夫博弈
题目 有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法, 一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者…...
文件二进制读写和文本读写以及编码解码
假如是utf8编码,windows系统 写:往键盘中写的字符会被utf8编码成字节写入文件。假如是文本写,\n会被替换为\r\n写入,结尾会加文件结束符EOF。假如是二进制写,\n就是\n,文件结尾也不会加什么EOF 读ÿ…...
Java学习手册:常见并发问题及解决方案
在Java并发编程中,开发者常常会遇到各种并发问题,这些问题可能导致程序行为不可预测、性能下降甚至程序崩溃。以下是一些常见的并发问题及其解决方案: 1.竞态条件(Race Condition) 竞态条件是指多个线程同时访问共享…...
幽灵依赖与常见依赖管理
文章目录 前言1. 演示:检测和修复幽灵依赖步骤1:安装 depcheck步骤2:在项目根目录运行 depcheck可能的输出步骤3:修复幽灵依赖 2. 依赖管理的好习惯 1. 场景设定现在有如下依赖需求: 2. 依赖冲突的表现3. 解决依赖冲突…...
第T7周:咖啡豆识别
🍨 本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 VGG 网络优缺点分析: ● 优点: 结构简洁统一:整张网络结构统一,只使用 33 的小卷积核和 22 的最大池化&…...
【MySQL数据库入门到精通】
文章目录 一、SQL分类二、DDL-数据库操作1.查询2.创建数据库3.删除数据库4.使用数据库 三、DDL-表操作1.查询 一、SQL分类 根据功能主要分为DDL DML DQL DCL DDL:Date Definition Language数据定义语言:定义数据库,表和字段 DML:Date Manipulatin Lan…...
C++智能指针的知识!
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 大家好呀,我是PingdiGuo_guo,今天我们来学习一下智能指针。 文章目录 1.智能指针的概念 2.智能指针的思想 3.智能指针的作用 3.1 自动内存管理 3.2 共享所有权 3.3 避免悬挂指针…...
4.6 实现重定向
本实战通过ServletDemo09类演示了Servlet中的重定向功能。该Servlet通过HttpServletResponse的sendRedirect方法实现页面跳转。在doPost方法中,根据请求参数username和password判断用户身份。若用户名为admin且密码为123456,则调用sendRedirect方法将页面…...
Linux中的管道
管道的概念 管道是一种进程间通信的方式。 管道是一种半双工通信机制,数据只能读或写,如果要读写同时进行就要创建两个管道 管道的类型 1、匿名管道PIPE:通常在亲缘进程中使用(兄弟、父子) 函数参考:匿名管…...
深入简出:KL散度、交叉熵、熵、信息量简介、交叉熵损失
学习这些的最终目的 1、量化两个概率分布的差异 2、推导交叉熵损失 一、KL散度 KL散度就是用来量化两个概论分布的差异,如何量化? 计算真实概论分布P信息量 和 估计概论分布为Q,但实际概率分布为P时信息量的差值 那么设,概率分…...
`peft`(Parameter-Efficient Fine-Tuning:高效微调)是什么
peft(Parameter-Efficient Fine-Tuning:高效微调)是什么 peft库是Hugging Face推出的用于高效参数微调的库,它能在不调整模型全部参数的情况下,以较少的可训练参数对预训练模型进行微调,从而显著降低计算资源需求和微调成本。以下从核心功能、优势、常见微调方法、使用场…...
Windows 图形显示驱动开发-WDDM 1.2功能—Windows 8 中的 DirectX 功能改进(五)
一、每个阶段的 UAV—架构革新与限制突破 在 Microsoft Direct3D 11 中,计算着色器 (UAV) 的无序访问视图数限制为 8 个, (像素着色器) RTV) UAV (8 个组合 (呈现目标视图。 在 DirectX 11.1 中,可绑定的数量已增加。 对于 DirectCompute&a…...
机械臂速成小指南(二十五):机械臂与人工智能的有机结合
👨🏫🥰🥳需要机械臂相关资源的同学可以在我的主页中寻找哦🤖😽🦄 指南目录📖: 🎉🎉机械臂速成小指南(零点五)&…...
浅析MySQL事务锁
在 MySQL 中,事务锁是用于确保数据一致性和并发控制的重要机制。事务锁可以帮助防止多个事务同时修改同一数据,从而避免数据不一致和脏读、不可重复读、幻读等问题。 以下是 MySQL 事务锁的关键点总结: 事务锁:用于确保数据一致性和并发控制。锁的类型: 行级锁:InnoDB,粒…...
Git学习之路(Updating)
常用命令 pwd :显示当前目录 git init: 在当前目录下创建一个新的仓库(空的) git add name.type:将文件添加到仓库 git commit -m "xx备注xx" :把文件提交到仓库。git commit一次可以提交很多文件。 git …...
【datawhaleAI春训营第一期笔记】AI+航空安全
记录了一些数据竞赛相关的知识,赛题的代码相关笔记可以从目录寻找 目录 数据竞赛知识前置知识TPOP竞赛分类: 机器学习基础线性模型树模型KNN模型神经网络 深度学习全连接网络深度学习正则化深度学习的优化卷积神经网络 竞赛基础知识数据清洗特征工程模型…...
pnpm解决幽灵依赖问题
文章目录 前言1. npm/yarn 现在还有幽灵依赖问题吗?2. pnpm 解决了幽灵依赖问题吗?3. pnpm 是如何解决的?举例说明 1. pnpm 的 node_modules 结构原理结构示意 2. 实际演示幽灵依赖的杜绝步骤1:初始化项目并安装依赖步骤2…...
梯度下降代码
整体流程 数据预处理:标准化->加一列全为1的偏置项 训练:梯度下降,将数学公式转换成代码 预测 模型代码 import numpy as np# 标准化函数:对特征做均值-方差标准化 # 返回标准化后的特征、新数据的均值和标准差,用于后续预测def standard(feats…...
七、LangChain Tool类参数对接机制解析:基于Pydantic的类型安全与流程实现
LangChain 的 Tool 类(包括 BaseTool 和 StructuredTool)通过 参数校验、输入解析、函数调用 的流程,将外部函数与 Agent 的逻辑对接。以下是其内部逻辑的详细解析: 1. 工具与函数对接的核心机制 (1) 工具的定义方式 LangChain 提供了两种主要方式定义工具: 继承 BaseTo…...
AIGC产品如何平衡用户体验与内容安全?
当ChatGPT能写诗、Sora会拍电影、AI主播24小时带货时,一场关于“AI说什么”的隐形战争,正在算法与监管的夹缝中悄然爆发。 从DeepSeek的冲击到多模态技术的祛魅,AIGC正在重塑内容创作的边界。但同时,诸多质疑也正在发声ÿ…...
uniapp打包报错,
######错误解决方案###### 错误描述: Android minSdkVersion配置问题 解决方案: 项目中配置的Android minSdkVersion比三方库中声明的minSdkVersion低,参考文档:https://uniapp.dcloud.net.cn/tutorial/app-android-minsdkversion…...
PC主板及CPU ID 信息、笔记本电脑唯一 MAC地址获取
🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 PC主板及CPU ID 信息物理 MAC地址获取win11 新电脑 wmic 安装❤️ 欢迎一起学AI…...
2025妈妈杯数学建模D题完整分析论文
问题1的解题思路围绕建立货量预测模型以预测未来1天各线路货量,并将货量拆解到10分钟颗粒度展开。首先需要对数据进行预处理,读取四个Excel文件(附件1、附件3、附件4、附件5),获取各文件中工作表名称,发现均…...
python-图片分割
图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,例如分割出物体、前景背景或特定的部分。在 Python 中,常用的图片分割方法包括传统的图像处理技术(例如阈值分割、区域生长等)和深度学习…...
AI——K近邻算法
文章目录 一、什么是K近邻算法二、KNN算法流程总结三、Scikit-learn工具1、安装2、导入3、简单使用 三、距离度量1、欧式距离2、曼哈顿距离3、切比雪夫距离4、闵可夫斯基距离5、K值的选择6、KD树 一、什么是K近邻算法 如果一个样本在特征空间中的k个最相似(即特征空…...
Transformer 架构 - 编码器 (Transformer Architecture - Encoder)
1.Transformer 编码器整体结构 Transformer 编码器的结构相对直观:它由 N 个完全相同的编码器层 (Encoder Layer) 堆叠而成。 图1: Transformer 编码器整体结构示意图 (简化) 输入序列(例如,通过 embedding 层转换后的词向量)首先会加上位置编码,然后传入第一个编码器层…...
深入理解 Transformer:从原理解析到文本生成实践
学习目标: 完成本教程后,学习者应该能够: 理解 Transformer 架构的核心思想,尤其是自注意力机制 (Self-Attention)。掌握 Transformer 编码器 (Encoder) 和解码器 (Decoder) 的内部结构和工作原理。理解位置编码 (Positional Enc…...
使用MetaGPT 创建智能体(2)多智能体
先给上个文章使用MetaGPT 创建智能体(1)入门打个补丁: 补丁1: MeteGTP中Role和Action的关联和区别?这是这两天再使用MetaGPT时候心中的疑问,这里做个记录 Role(角色)和 Action&…...
数据结构学习笔记 :树与二叉树详解
目录 树的基本概念二叉树的定义与特性二叉树的存储结构 3.1 顺序存储 3.2 链式存储二叉树遍历特殊二叉树类型总结与应用场景 一、树的基本概念 核心定义 树:由根节点和若干子树构成的层次结构。叶子节点(终端节点):没有子节点的…...
基于大模型的直肠息肉诊疗全流程风险预测与方案优化研究报告
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型技术概述 2.1 大模型原理简介 2.2 大模型在医疗领域应用现状 三、直肠息肉术前预测与准备 3.1 基于大模型的术前风险预测 3.1.1 息肉性质预测 3.1.2 手术难度预测 3.2 基于预测结果的术前准备 3.…...
Python作业4 文本词云统计,生成词云
编写程序,统计两会政府工作报告热词频率,并生成词云。 2025两会政府工作报告 import jieba import wordcloud from collections import Counter import re# 读取文件 with open("gov.txt", "r", encoding"gbk") as f:t …...
AI绘制流程图,方法概述
1 deepseek 生成图片的mermaid格式代码,在kimi中进行绘图或在jupter notebook中绘制: 或在draw.io中进行绘制(mermaid代码) 2 svg是矢量图,可以插入到word """mermaid graph TDA[基线解算] --> B[北…...
Netlink套接字
netlink套接字 Netlink套接字是专门用于用户控件与内核之间的通讯,尤其是监听uevent事件(热插拔,模块加载等); socket(AF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, NETLINK_KOBJECT_UEVENT); AF_NETLINK:Netlink协议族 SOCK_DGRAM…...
settimeout和setinterval区别
1. setTimeout:单次延迟执行 语法: const timeoutId setTimeout(callback, delay, arg1, arg2, ...); 核心功能:在指定的 delay(毫秒)后,执行一次 callback 函数。 参数: callback&#x…...
在排序数组中查找元素的第一个和最后一个位置--LeetCode
题目 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 示例 1: 输入:nums [5,7,7,8,8,10], target 8输出&#x…...
MySQL快速入门篇---库的操作
目录 一、创建数据库 1.语法 2.示例 二、查看数据库 1.语法 三、字符集编码和校验(排序)规则 1.查看数据库支持的字符集编码 2.查看数据库支持的排序规则 3.查看系统默认字符集和排序规则 3.1.查看系统默认字符集 3.2.查看系统默认排序规则 …...
rancher 网红无法上传大视频,小于2m可以正常上传
rancher 部署的nginxphp7.4 架构 阿里云oss rancher ingress 本次问题只需要修改php配置即可 nginx 通过映射配置文件直接修改 php 通过添加新的映射文件配置修改 ingress 可以rancher控制台修改yaml 文件 oss 不需要做配置 rootworker3:/data/nfs# sudo cat php/upload.in…...
Linux 文件查找终极指南:find, locate, grep 等命令详解
在 Linux 系统管理和日常使用中,文件查找是一项不可或缺的基本技能。无论是寻找配置文件、查找日志文件中的特定错误,还是清理旧的临时文件,掌握高效的文件查找工具都能让你事半功倍。Linux 提供了多种强大的命令行工具来满足不同的查找需求。本文将详细介绍几个最常用、最强…...
python豆包语音合成并播放
豆包语音合成文档入口:账号登录-火山引擎 #codingutf-8 requires Python 3.6 or later pip install requestsimport base64 import json import requests from playsound import playsoundtts_file_name"doubaotts.mp3" def doubao_tts(text):语音合成ap…...
LoRA(Low - Rank Adaptation,低秩自适应 )微调技术改进创新点
LoRA(Low - Rank Adaptation,低秩自适应 )微调技术改进创新点 模型参数层面 低秩分解创新:LoRA核心是对权重矩阵低秩分解,将原始权重矩阵分解为固定的预训练权重部分和可训练的低秩变化量部分。传统全量微调需更新全部参数,而LoRA只更新低秩矩阵参数,大幅减少可训练参数…...
Shell脚本-变量是什么
在Shell脚本编程中,变量是一个非常基础且重要的概念。它们用于存储数据,并可以在整个脚本中引用这些数据来执行各种操作。理解如何定义、使用和管理变量是编写有效Shell脚本的关键。本文将详细介绍Shell脚本中的变量,包括其基本概念、类型以及…...