【Linux我做主】进度条小程序深度解析
Linux下C语言进度条程序深度解析
- 进度条小程序
- GitHub地址
- 前言
- 前置知识
- 回车换行(CR/LF)的深度解析
- 历史渊源与技术规范
- 在进度条/倒计时中的应用
- 缓冲区机制的全面剖析
- 缓冲区引入
- 缓冲类型对比
- 进度条开发中的关键控制
- 进度条实现
- 以小见大——倒计时
- 倒计时最终效果演示
- 错误演示
- 位宽不够带来的影响
- 设置位宽后不反转带来的影响
- 不使用\r回车带来的影响
- 总结回顾倒计时
- 进度条架构设计
- 组件关系图
- 核心数据结构
- 版本迭代解析
- v1版本悟原理
- progressBar.h头文件
- progressBar.c源文件
- main.c调用
- V2版本求拓展
- progressBar.h头文件
- progressBar.c源文件
- main.c模拟多任务调度实现
- 最终效果演示
- Makefile配置要点
- 结语
进度条小程序
GitHub地址
有梦想的电信狗
前言
在Linux
系统编程中,控制台交互的视觉反馈是提升用户体验的重要环节。进度条作为经典的人机交互组件,在软件安装、文件传输、数据处理等场景中具有广泛应用价值。本文将以Linux
环境下C语言实现的进度条程序为切入点,深入探讨控制台输出控制、缓冲区机制、函数指针应用等核心技术。通过三个版本迭代的代码解析(基础版/V1、模拟多任务版/V2),读者将掌握从原理到实践的完整知识链路。
前置知识
回车换行(CR/LF)的深度解析
在C语言中,我们使用\n
来表示换行,这其实是C语言帮我们做了处理。实际上,回车和换行其实是两个动作。
C语言中用
\n
来表示回车和换行。
以上图片深入阐述了回车和换行概念以及和区别。
\r
:回车,光标回到当前行的最开始。C语言中用\r
来表示仅回车。\n
:换行,光标垂直向下移动一行,叫做换行。
历史渊源与技术规范
- ASCII规范定义:
CR
(Carriage Return,\r
,ASCII 13
)将光标移动到行首 LF
(Line Feed,\n
,ASCII 10
)使光标下移一行Windows
系统采用CRLF
组合实现新行操作Linux/Unix
系统使用LF
单独完成换行
在进度条/倒计时中的应用
printf("%-3d\r", cnt); // 关键代码示例
此代码实现:
- 使用
%-3d
保证3字符宽度左对齐- 3表示该值位宽为3,C语言默认为右对齐,用
-
来表示左对齐。
- 3表示该值位宽为3,C语言默认为右对齐,用
\r
使每次输出回到行首- 配合
fflush(stdout)
强制刷新缓冲区 - 实现原地更新的数字倒计时效果
缓冲区机制的全面剖析
缓冲区引入
先看如下两个例子:
- 有换行符
\n
时显示器直接刷新
- 无换行符时,像是先执行了
sleep
再执行printf
经分析得知: C语言
中一定是按顺序执行代码的,因此一定是printf
先执行,再执行sleep
。- 那么,在
sleep
期间,printf
函数一定已经执行完了。 - 那么,
sleep
期间,hello wolrd
在哪里?
综上,hello wolrd
一定是被保存起来了!!!
保存hello wolrd
,必然 需要一块内存空间,这块内存空间被称为缓冲区。
- 缓冲区就是由
C语言
维护的一段内存。
C程序运行时,默认会帮助我们打开三个输入输出流
stdin
:标准输入stdout
:标准输出(默认是显示器)stderr
:标准错误
C语言的默认行为是在程序退出时,再刷新缓冲区。
printf
打印消息,是向stdout
输入,消息暂存在了stdout
中,当我们不想让消息暂存在缓冲区中,而是想直接刷新stdout
的内容到显示器时,可以使用fflush
刷新,默认stdout
在程序结束时刷新,使用fflush
可以强制进行刷新输入输出流。
- 以下:
- 此时
printf("hello world")
没有\n
- 使用
fflush(stdout)
强制将缓冲区中的数据刷新到显示器上
通过以上两个例子,我们已经对缓冲区有了一个大概的理解了。
缓冲类型对比
缓冲类型 | 特征 | 典型应用场景 |
---|---|---|
全缓冲 | 缓冲区满时刷新 | 文件操作 |
行缓冲 | 遇到换行符或缓冲区满时刷新 | 终端输出(默认) |
无缓冲 | 立即输出 | 标准错误流stderr |
进度条开发中的关键控制
- 手动刷新机制:
fflush(stdout); // 强制立即输出缓冲区内容
进度条实现
以小见大——倒计时
倒计时最终效果演示
- 代码如下:
void test() {//实现一个倒计时int cnt = 100;while (cnt >= 0) {// printf("%-2d\r", cnt);//使用\r回车会导致三位数只刷新了两位数printf("%-3d\r", cnt); // %3d\r 可以实现在行的开头更新数字 -相当于反转 确保是左对齐fflush(stdout);--cnt;sleep(1);}printf("\n");
}
int main() {test();return 0;
}
- 当前设置倒计时从
100
开始 - 关于
printf
中的参数%-3d\r
的解释%d的作用
:表示输出数字cnt
,用于显示倒计时3的作用
:用于控制输出显示位宽为3
,倒计时的数字是几位,位宽就设置为几。-的作用
:设置位宽后,C程序默认为右对齐,我们想让数字在当前行的最左侧显示,要用-
实现左对齐。\r的作用
:用于实现仅回车,回到当前行的开始,覆盖打印实现倒计时的效果。
- 使用
fflush(stdout)
将缓冲区内的数据立即刷新出来 sleep(1)
每隔一秒循环一次
错误演示
位宽不够带来的影响
- 位宽小于数字的位数时,会出现数字残余的情况。
- 由于显示器是字符设备,只会一个一个打印字符,123实际上是1 2 3三个字符连在一起表示的
- 以下是从10开始计数的错误例子
- 正确设置位宽即可解决。
设置位宽后不反转带来的影响
- 不用
-
进行反转会导致数字不靠左显示- 对于倒计时来说影响甚微,但靠右显示的话,会导致进度条从右向左加载!
不使用\r回车带来的影响
- 不使用
\r
会导致数字接连不断的出现,不符合倒计时的效果。
总结回顾倒计时
printf
中的格式化控制参数缺一不可
- 关于
printf
中的参数%-3d\r
的理解%d
表示输出数字cnt
,用于显示倒计时3
用于控制输出显示位宽为3
,倒计时的数字是几位,位宽就设置为几。- 设置位宽后,C程序默认为右对齐,我们想让数字在当前行的最左侧显示,要用
-
实现左对齐。 \r
用于实现仅回车,回到当前行的开始,覆盖打印实现倒计时的效果。
- 使用
fflush(stdout)
将缓冲区内的数据立即刷新出来
进度条架构设计
组件关系图
核心数据结构
#define NUM 102 // 缓冲区长度(含终止符)
#define BODY '=' // 进度条主体字符
#define HEAD '>' // 进度头部指示符
#define TOP 100 // 进度最大值typedef void (*callback_t)(int); // 标准化回调接口
- 利用函数指针实现回调。
版本迭代解析
v1版本悟原理
progressBar.h头文件
#pragma once#include <stdio.h>//缓冲区长度(含终止符)
#define NUM 102 // 102 表示字符数组的长度 0-100 101个字符 末尾是\0, 因此大小是 102
#define BODY '=' // 进度条主体字符
#define HEAD '>' // 进度头部指示符
#define TOP 100 // 进度最大值extern void progressbar(int speed); // extern 声明外部变量时必须加上 函数声明可加可不加
#pragma once
:防止头文件重复包含#define NUM 102
:102
表示字符数组的长度,0-100
,共101
个字符 ,字符串末尾是\0
, 因此数组长度是102
#define BODY '='
:定义进度条的形体为=
#define HEAD '>'
:定义进度条的头部为>
#define TOP 100
:定义进度条的区间长度,暂定为100
通过宏的方式定义,可以方便的实现进度条样式的修改!
progressBar.c源文件
#include "progressBar.h"
#include <string.h>
#include <unistd.h>char bar[NUM] = {0};
const char* label = "|/-\\";void progressbar(int speed) {memset(bar, '\0', sizeof(bar)); //整体将字符串设为\0,可以方便的输出int len = strlen(label);int cnt = 0;while (cnt <= TOP) {//没有\n 就没有立即刷新,因为显示器默认是行刷新printf("[%-100s][%d%%][%c]\r", bar, cnt, label[cnt % len]);//预留出100空间,100s 默认是右对齐,进度条是反的, 用-100s解决//用变长的字符串,循环覆盖输出,实现进度条光标移动的效果//给进度条跑 %%显示百分号fflush(stdout);bar[cnt++] = BODY; //更改进度条的风格if (cnt < TOP)bar[cnt] = '>';// sleep(1);usleep(speed); // 100000微秒,用usleep实现更快的跑完}printf("\n"); //防止命令行提示符影响效果
}
char bar[NUM] = {0}
:进度条主体使用长度不断改变的字符串来实现- 初始化为{0},这样就不用手动设置
\0
终止符了,用%s
输出变化的字符串 - 从
0-100
,恰好是char bar[NUM] = {0}
字符数组中每个字符的下标 - 每次循环内
cnt
会++- 利用
cnt
将0-100
每个位置的字符都设置为进度条主体=
。 - 随着
cnt++
,数组内字符串的长度也在增长,再通过%s\r
回车数组字符串,从而实现进度条的动态增长
- 初始化为{0},这样就不用手动设置
const char* label = "|/-\\"
- 通过
0-4
五个字符的顺序循环输出,实现光标闪动的效果。
- 通过
printf("[%-100s][%d%%][%c]\r", bar, cnt, label[cnt % len])
[%-100s]
-
:确保进度条不反方向增长100s
:预留出100
长度,供进度条字符串填充
[%d%%]
:%d
:输出进度数字cnt
%%
:控制输出字符%
[%c]
:控制循环顺序输出|/-\\
中的每个字符,实现光标闪动的效果- 用
cnt % len
实现0-4
的循环
- 用
\r
:实现每次从行首开始输出,实现进度条的动态增长!
fflush(stdout)
:每次printf
过后,刷新缓冲区usleep(speed)
:usleep
结合函数参数speed
,实现进度条时长的控制
main.c调用
#include <unistd.h>
#include "progressBar.h"int main(){progressbar(20000);return 0;
}
效果如下:
V2版本求拓展
- 进度条最常见的适用场景就是在下载任务中,具体的运行方式应该是:
- 下载任务向进度条函数传递下载任务已完成的进度百分比,进度条函数根据比率动态显示
- 因此下载任务内一定要反复调用进度条程序。
- 我们可以传入进度条函数的地址进行实现,也就是函数指针的回调函数。
progressBar.h头文件
#pragma once#include <stdio.h>//缓冲区长度(含终止符)
#define NUM 102 // 102 表示字符数组的长度 0-100 101个字符 末尾是\0, 因此大小是 102
#define BODY '=' // 进度条主体字符
#define HEAD '>' // 进度头部指示符
#define TOP 100 // 进度最大值typedef void (*callback_t)(int); //函数指针类型extern void progressbar(int rate); // extern 声明外部变量时必须加上 函数声明可加可不加
extern void downLoad(callback_t cb);
extern void initBar();
typedef void (*callback_t)(int)
:callback_t
是函数指针类型,我们可以拆解帮助理解:void (*)(int)
:其中:*
:表示这是一个指针,且必须用括号包裹。否则会被解析为函数返回指针(如void *func(int)
是返回void*
的函数)(*)
:表示这是一个函数指针void
:表示该函数的返回值为void,(int)
:表示该函数的参数类型为一个int
typedef void (*callback_t)(int)
可以理解为typedef void (*)(int) callback_t
typedef
:在typedef
中,参数名会被省略,只保留类型。因此可以拆解为:typedef void (*)(int) callback_t
:将void (*)(int)
类型的指针定义为类型别名callback_t
progressBar.c源文件
#include "progressBar.h"
#include <string.h>
#include <unistd.h>
// v2 应用
char bar[NUM] = {0};
const char* label = "|/-\\";void initBar() {memset(bar, '\0', sizeof(bar));
}
void progressbar(int rate) {if (rate < 0 || rate > 100)return;int len = strlen(label);//用单个字符循环覆盖输出实现光标闪动printf("[%-100s][%d%%][%c]\r", bar, rate, label[rate % len]);fflush(stdout);bar[rate++] = BODY; //更改进度条的风格if (rate < TOP)bar[rate] = HEAD;
}
优化亮点:
-
全局状态保存实现多任务支持
-
initBar()
提供重置进度条的能力 -
动态头部指示符(>)增强视觉效果
-
增加非法进度的判断
if (rate < 0 || rate > 100) return
main.c模拟多任务调度实现
#include <unistd.h>
#include "progressBar.h"
// 模拟下载任务调用进度条
void downLoad(callback_t cb) { int total = 1000;int curr = 0; //目前curr需要从0开始while (curr <= total) {//进行某种下载任务,模拟时使用手动控制速度usleep(50000);int rate = curr * 100 / total;cb(rate); // 传入参数,回调展示进度curr += 10;}printf("\n"); //防止命令行提示符影响效果
}int main() {printf("downLoan 1:\n");downLoad(progressbar);initBar();printf("downLoan 2:\n");downLoad(progressbar);initBar();printf("downLoan 3:\n");downLoad(progressbar);initBar();return 0;
}
- 通过任务调用进度条,外部程序通过回调,调用进度条
void (callback_t)(int)
,callback_t
是函数指针类型。- 相当于
typedef void (*)(int) callback_t
,把callback_t
变成函数指针类型的别名
- 相当于
关键技术:
- 函数指针实现回调机制
- 速率换算算法(
curr * 100 / total
) - 时间控制(
usleep
微秒级延时) char bar[NUM]
为全局数组,每次模拟download
后,需initbar()
函数重置保证独立性- 模块化设计,确保了可维护性。
最终效果演示
Makefile配置要点
# 依赖关系# 依赖方法
progressBar:*.c @gcc $^ -o $@# clean和上面是独立的
.PHONY:clean
clean:@rm -f progressBar
结语
关键知识点回顾
- 控制台输出控制:回车符与换行符的灵活运用
- 缓冲区机制:行缓冲特性与强制刷新策略
- 可视化设计:进度条元素(主体、头部、百分比)的协同
- 软件工程实践:模块化设计、回调机制、多任务支持
扩展应用场景
- 大数据处理进度监控
- 嵌入式系统固件更新
- 自动化测试进度反馈
- 游戏加载界面优化
通过本文对Linux下C语言进度条程序的深度解析,我们系统性地掌握了控制台交互的核心技术。从回车换行符的底层原理到缓冲区刷新机制,从进度条动态显示到模块化设计,每一步都揭示了控制台可视化反馈的实现精髓。通过函数指针与回调机制的精妙配合,我们实现了多任务场景下的独立进度管理,展现了C语言在系统编程中的强大灵活性。
本项目的核心价值在于:不仅实现了基础的进度展示功能,更通过版本迭代演进,示范了软件开发的渐进式优化思路。在性能层面,未来可结合纳秒级延时控制与多线程安全机制提升精度;在交互层面,可考虑引入ANSI色彩代码或动态图标可进一步增强用户体验。
分享到此结束啦
一键三连,好运连连!
相关文章:

【Linux我做主】进度条小程序深度解析
Linux下C语言进度条程序深度解析 进度条小程序GitHub地址 前言前置知识回车换行(CR/LF)的深度解析历史渊源与技术规范在进度条/倒计时中的应用 缓冲区机制的全面剖析缓冲区引入缓冲类型对比进度条开发中的关键控制 进度条实现以小见大——倒计时倒计时最…...
MySQL 使用全局锁会导致的问题?
MySQL 使用全局锁会导致以下核心问题: 业务停摆与主从延迟 主库备份:备份期间所有更新操作被阻塞,业务系统陷入等待状态从库备份:无法执行主库同步的 binlog,导致主从复制延迟加剧 并发性能急剧下降 …...

从Homebrew找到openssl.cnf文件并拷贝到Go项目下使用
安装OpenSSL 在 macOS 上下载和安装 OpenSSL 最常见和推荐的方式是使用 Homebrew,这是一个 macOS 缺失的包管理器。 如果您还没有安装 Homebrew,请先安装它。安装 Homebrew 后,安装 OpenSSL 只需要一条命令。 步骤 1:安装 Home…...
在Java对象转JSON字符串时不显示无值参数
在Java中,可以通过在展示数据的逻辑中添加判断条件来实现这一需求。以下是一些常见的场景和实现方法: 场景一:在Java对象转JSON字符串时 使用Gson库 代码实现 首先引入Gson依赖,如果使用Maven构建项目,在pom.xml文件中…...
在 Ubuntu 服务器上 下载 Clash 文件使用代理
文件Clash.Verge_1.3.8_x64_portable.zip 在 Ubuntu 服务器上不能使用这个Clash 文件**,我们需要的是 Clash.Meta 而不是 Clash Verge GUI 客户端 也就是 Clash Verge GUI 客户端的 Windows 版本,是给 Windows 桌面环境用的图形界面,不适用…...

微信小程序一次性订阅封装
封装代码如下: export async function subscribeMessage(tmplIds: string[]): Promise<ISubscribeMessagePromise> {// 模板ID// 1、获取设置状态const settings (await wx.getSetting({ withSubscriptions: true })).subscriptionsSetting || {}console.log…...
Spring AI MCP的几个小问题
测试时间:2025/05/29 测试版本:Spring AI 1.0.0 问题1:由于启动顺序问题,MCP的服务器端和客户端不能在一个应用里,不然客户端连不上服务器会报错退出。(实际项目应该没有这样用的) 问题2:现在如果配置了…...

安全帽检测算法AI智能分析网关V4守护工地/矿山/工厂等多场景作业安全
一、方案概述 在工业生产与建筑施工场景中,安全帽是保障人员安全的重要装备。但传统人工巡检效率低、易疏漏,难以满足现代安全管理需求。AI智能分析网关V4安全帽检测方案,借助人工智能与计算机视觉技术,实现作业现场安全帽佩戴…...
Pycharm的简单介绍
目录 1. 起源与发展历史 2. 定位与核心作用 3. 主要版本 4. 应用场景 5. 核心功能与优势 6. 优缺点分析 7. 使用入门指南 8. 适用人群 9. 替代工具对比 总结 1. 起源与发展历史 公司背景:由捷克公司 JetBrains(成立于2000年)开发&a…...
重新安装解决mac vscode点击不能跳转问题
依次执行以下过程 删除vscode程序 删除vscode的缓存文件夹(xxx表示你的用户名) /Users/xxx/Library/Application Support/Code 重新安装vscode 这时候你会反向可以跳转项目内的import 文件以及自定义函数。但是import安装的包还不能点击跳转 配置python环境 如果你电脑没有安…...
Go语言中flag包的用法详解
在Go语言编程中,flag包是标准库中用于解析命令行参数的强大工具。它提供了一种简单且灵活的方式来定义和处理命令行标志(flag),使得程序能够从命令行接收用户输入的参数。本文将详细介绍flag包的用法,包括基本概念、常…...

Python自动化之selenium语句——打开、关闭浏览器和网页
目录 一、打开谷歌浏览器 1.双击桌面的Pycharm工具 2.新建Python文件,输入文件名 3.新建的Python文件如下 4.安装selenium库 5.导入包 二、打开网页、关闭网页、关闭浏览器 1.导入增加一个时间包 2.使用函数打包之前写的浏览器的配置 3.调用 4.打开百度网…...

【数据结构】--二叉树--堆(上)
一、树的概念和结构 概念: 树是一种非线性的数据结构,他是由n(n>0)个有限结点组成一个具有层次关系的集合。其叫做树,是因为他倒过来看就和一棵树差不多,其实际上是根在上,树枝在下的。 树的特点: 1…...
Rust 学习笔记:使用迭代器改进 minigrep
Rust 学习笔记:使用迭代器改进 minigrep Rust 学习笔记:使用迭代器改进 minigrep不使用 clone,而使用迭代器使用迭代器适配器使代码更清晰在循环或迭代器之间进行选择 Rust 学习笔记:使用迭代器改进 minigrep 前情提要࿱…...

多线程(5)——单例模式,阻塞队列
目录 单例模式饿汉模式懒汉模式—单线程版懒汉模式—多线程版(经典面试题)懒汉模式—多线程版(改进) 阻塞队列阻塞队列是什么生产者消费者模型标准库中的阻塞队列-BlockingQueue阻塞队列实现 单例模式 单例模式是一种设计模式&am…...
React整合【ECharts】教程004:饼图的构建和基本设置
文章目录 6、饼图6.1 开启圆角环形6.2 设置扇区间隙6.3 开启深色模式6.4 开启南丁格尔玫瑰图6.5 修改数据重绘饼图6.6 完整代码下载6、饼图 6.1 开启圆角环形 1️⃣添加圆角环形开关: <div style={{marginTop:10px}}>圆角环形:<Switch checkedChildren="开启…...

视频监控汇聚平台EasyCVR工业与安全监控:防爆摄像机的安全应用与注意事项
石油、化工、煤矿等行业存在易燃易爆气体、粉尘,普通监控设备易因电火花、高温引发爆炸火灾。随着工业规模扩大,安全生产监控需求激增,防爆摄像机成为保障安全的关键。加之国家法规与行业标准对危险环境监控设备要求严格,规范其应…...
Android 倒计时总结
文章目录 Android 倒计时总结Handler方案CountDownTimer方案Timer方案Flow方案总结源码下载 Android 倒计时总结 Handler方案 class MyHandler(private val intervalTime: Long, // 间隔private val totalTime: Long, // 总时长onTick: (Long) -> Unit, // 每秒回调onFini…...

基于 Redis 实现分布式锁:原理及注意事项
文章目录 基于 Redis 实现分布式锁:原理及注意事项基于 Redis 实现分布式锁的原理Redis 分布式锁的过期时间和锁续期机制如何防止锁被其他 goroutine 删除?Redis 分布式锁存在的单点故障问题:基于 RedLock 的解决方案高并发场景中 Redis 分布…...

手机设备多?怎样设置IP保证不关联
在移动互联网时代,多设备运营(如电商、游戏工作室、社交媒体矩阵)常面临IP关联风险,轻则账号受限,重则封禁。以下提供6种高效设置独立IP的方法,结合技术原理与实操建议,助您打造稳定合规的运营环…...
Linux 中常见的安全与权限机制
Linux 中常见的安全与权限机制主要包括以下几类,从文件系统权限到系统级访问控制,构建了多层次的安全保障体系。 🔐 一、文件权限与用户管理 1. 基本权限(rwx) r(read):读取文件内…...
Golang|单例模式
单例模式定义:在程序运行期间,某个结构体只创建一个实例。适用场景:如数据库连接池,在整个程序运行期间只需要一个连接池实例。 方案一:通过加锁的方式,如读写锁,确保在并发情况下只创建一个实…...

哈尔滨工业大学计算机系统大作业程序人生-Hello’s P2P
摘 要 文章以C语言程序设计经典案例hello.c为研究对象,系统解析程序在计算机系统中的完整生命周期。剖析源代码通过预处理、编译、汇编、链接四阶段演化为可执行目标程序的编译系统工作机制,继而从进程视角揭示程序运行时计算机体系结构的协同运作&…...
小程序定制开发:从需求到落地,打造企业专属数字化入口
在移动互联网时代,小程序已成为企业连接用户的核心载体。定制开发因能深度匹配企业需求,正成为各行业数字化转型的优选方案。以下从优势、流程、技术、案例四方面展开,助你快速掌握关键要点。 一、定制开发的核心优势 1. 高度个性化&#x…...
【C/C++】基于 Docker 容器运行的 Kafka + C++ 练手项目
文章目录 基于 Docker 容器运行的 Kafka C 练手项目1 项目目的2 项目框架3 代码4 编译运行5 功能与接口说明5.1 Producer 接口:producer.cpp关键调用流程参数说明 5.2 Consumer 接口:consumer.cpp关键调用流程消费流程中注意 5.3 工程技术点 基于 Docke…...

Linux系统管理与编程24:基础条件准备-混搭“本地+阿里云”yum源
兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 1.添加宿主机共享文件夹 Linux虚拟机可以和宿主机共享文件夹,这样有利于工具文件的共享。具体操作如下: 1)vmware workstation共享文件夹 虚拟机…...
新一代Python管理UV完全使用指南|附实际体验与效果对比
简介 uv是新一代的Python项目管理工具,具备开发一个完整项目的所有功能点: 功能点描述包管理完全替代pip的功能,支持包的安装、升级、卸载等操作虚拟环境管理内置虚拟环境创建和管理,无需额外安装virtualenv或venv依赖解析与锁定…...

如何在 Windows 10 PC 上获取 iPhone短信
您可以轻松地将媒体数据从 iPhone 传输到 Windows 计算机,并直接访问计算机上的数据。但是,您可以在 Windows 10 PC 上接收 iPhone 短信吗?有什么功能或工具支持它吗?如果您发现在 Windows 10 PC 上接收 iPhone 消息很困难&#x…...
STM32程序运行不了,仿真功能也异常,连断点和复位都异常了
先检查有没有出现复位引脚rst短接0的情况 在检查是否出现明明没配置该外设你却偏偏要使用的情况,比如串口没配置你却偏要发送,引脚没配置你却偏要读取 这几个可能最好的办法就是从开头一行一行注释再运行看看能不能跑起来 还可以用以下方法 检查硬…...

Linux 系统中的软链接与硬链接
目录 一、什么是软链接? 1. 创建软链接 2. 软链接的特性 3. 软链接的用途 二、什么是硬链接? 1. 创建硬链接 2. 硬链接的特性 3. 硬链接的用途 4. 目录硬链接的特殊性 编辑 三、软链接与硬链接的区别 1. inode 编号 2. 路径依赖 3. 删除行…...