最新资讯

  • Linux《进度条》

Linux《进度条》

2025-04-29 10:00:35 1 阅读

在之前的Linux基础开发工具当中我们已经了解了vim、gcc、makefile等基本的开发工具,那么有了这些开发工具我们就可以来实现我们Linux旅程当中的第一个程序——进度条。相信通过该项目的实现能让你对vim等开发工具更加的熟悉。一起加油吧!!!


1.补充知识回车与换行 

在实现进度条的项目之前我们先要来了解关于回车和换行的基础补充知识,在了解之后才能让接下来的项目的编写更加的顺畅。

首先我们要了解的是回车和换行有什么区别,此时你可能就会疑惑这两个实现的效果不是一样的吗?我们在点击回车的时候不就是实现了换行了吗?

其实这两个实现的效果是不同的,只不过在现代的计算机当中基本将这两个概念不进行区分了,但在上个实际使用的老式打字机上换行自是将对应的纸向下移动,而要将实现回车还需要将指针移动回起始位置。

那通过以上的示例就可以理解在现代的计算机当中回车其实是 换行+回车 的,通过以下的老式键盘就可以看出这一特点

其实在之前在C语言当中使用的 就是本质上就是实现了换行+回车的功能, 实现的就是回车的功能。 


2.练手小程序——倒计时

以上我们了解了回车的本质,那么接下来就来通过一个倒计时的小程序来作为实现进度条项目之前的联手项目,不过在实现之前先要通过以下的代码得出一个规则。

首先来看以下的代码:

#include
#include 
    
int main()
{    
    printf("hello world
");
    sleep(5);                                                                                                                                          
  
    return 0;
}

在以上的代码当中运行会出现什么样的现象呢?

通过运行形成可执行程序以上的代码输出的效果如下所示:
 

此时就可以看出首先会在显示器当中打印出hello world,之后在休眠5妙再让程序结束

再看以下的代码会有什么现象:

#include
#include 
    
int main()
{    
    printf("hello world");
    sleep(5);                                                                                                                                          
  
    return 0;
}

以上的代码相比原来的代码只是少了一个换行符 ,此时该程序运行的结果会和之前的一样吗?

通过将该程序形成可执行程序运行之后就可以看出和之前不同,该程序一开始没有将hello world输出到显示器上,而是到程序结束的时候才打印到显示器上,那么为什么会有这样的现象呢? 


 

要解答以上的问题就需要了解C语言当中进行输出的流程是怎么样的,其实在将对应的信息输出到显示器之前是会将数据先存储到缓冲区,之后再统一的将缓冲区内的数据刷新到显示器上,因此以上的两份代码再执行完printf("hello world ")与printf("hello world")之后都是将执行完的结果存储到缓冲区当中,那么为什么第一份代码能直接将结果显示到显示器上呢?

这其实和其实和显示器行刷新的策略有关,当使用 之后会将缓冲区当中的数据刷新到显示器上,而第二份代码当中未使用 就使得程序缓冲区当中的数据需要在程序结束的时候才刷新到显示器上,这也是第二份代码形成的可执行程序在最后才会显示出来。

那么在第二份代码当中不使用 但要使其与第一份代码执行出相同的效果,要使用什么样的方式呢?

在此就需要了解一个库函数fflush

在此fflush的作用就是将缓冲区当中的数据进行强制刷新。我们知道在C语言的程序启动时默认会打开stdin、stdout、stderr三个标准输入输出流,那么此时就可以将缓冲区当中的数据强制刷新到标准输出流stdout上。

改进的代码如下所示:

#include
#include 
    
int main()
{    
    printf("hello world");
    fflush(stdout);
    sleep(5);                                                                                                                                          
  
    return 0;
}

以上代码形成可执行程序之后输出结果如下所示:


了解了缓冲区之后接下来就来尝试编写倒计时程序的代码,在此要求是从10开是倒计时,倒计时的数字在同一行内一直进行刷新,直到最后数字未0时结束 

那么接下来就很容易的能实现出以下的代码

#include    
#include    
 
    
int main()    
{    
    int cnt= 10;    
    while(cnt>=0)    
    {    
        printf("%d
",cnt);    
        cnt--;                                                                                                                                               
        fflush(stdout);    
        sleep(1);    
    }    
    
    printf("
");    
    
    
    return 0;    
}    

以上的代码就是使用了以上我们学习的fflush在进行每一次的printf之后就进行强制的刷新,并且在每次输出一个数字之后使用 进行回车,这样就可以使得每一秒显示器上会出现一个数字且在同一行内输出。但是以后的代码还有一个问题,我们来通过运行看看。

通过以下的输出就可以看出问题的所在是在输出时一开始打印的10是两位数,之后再进行打印的是一位数,这就会使得打印出的结果变为了90、80……

这个问题形成的原因是由于printf在输出时默认的是右对齐,此时要修改为左对齐只需要在printf的占位符%之后加上一个-2即可,这样就可以限定最小宽度为2

修改之后的代码如下所示:

#include    
#include    
 
    
int main()    
{    
    int cnt= 10;    
    while(cnt>=0)    
    {    
        printf("%-2d
",cnt);    
        cnt--;                                                                                                                                               
        fflush(stdout);    
        sleep(1);    
    }    
    
    printf("
");    
    
    
    return 0;    
}    

输出结果如下所示:

3.进度条项目实现

通过以上的倒计时小程序我们完成了在实现进度条项目之前的练手,那么接下来就可以开始实现我们Linux学习当中的第一个项目,在此会实现两个版本的进度条项目,其中第一个版本的代码较为简单,但是不具有实用性,第二份的代码才具有实用性。

在实现代码之前首先要来明确我们的实现的项目的要求是什么,在此实现出的效果需大致如下所示:

首先是有一个进度条进行进度的推进直到进度条满为止,在进度条之后有一个显示当前进度的百分比数,之后有一个旋转的光标来表示当前进度条是在推进的。

 

3.1 v1版本

在实现该进度条项目时分为三个文件,在process.h内进行实现函数的声明,在process.c内实现对应的函数,在main.c使用实现的函数来实现进度条

那么接下来就先来实现第一个版本的进度条,在此创建一个函数process_v1,在该函数内实现对应的代码。在该版本当中的进度条只需要每秒使得进度条向后推进指定的进度即可,并且在进度条之后的百分数也显示对应的进度值。

 但在实现process_v1内的函数代码之前我们先要将该程序对应的makefile进行构建

makefile内的内容如下所示:

BIN=process.exe    
SRC=$(wildcard *.c)                                                                                                                                          
OBJ=$(SRC:.c=.o)    
CC=gcc    
    
    
$(BIN):$(OBJ)    
    $(CC) -o $@ $^    
%.o:%.c    
    $(CC) -c $<    
    
    
.PHYNO:clean    
clean:    
    rm -f $(OBJ) $(BIN)    
    

接下来就来实现第一个版本的进度条

首先在实现进度条要从0到100,那么就创建一个大小为101的字符数组来存储对应的进度数据,使用'#'来表示进度元素,接下来使用memset函数将数组buffer内的元素都初始化为0。 

由于要在进度条的最后使用一个动态的翻转来表明进度条是在运行的,那么在此就创建一个数组tmp,该数组内存储对应的字符,进度条每增长一位就将对应的状态字符改变,

在此字符串内使用是因为两个才会被转译为

接下来创建一个变量cnt来表示当前进度条的进度值,使用while喜欢来实现0到100进度。在此过程中每次打印完字符串、进度条百分比、状态元素之后都要回车并且进行强制刷新。 

每次打印完之后将buffer数组内对应cnt下标位置元素修改为'#',再让cnt++

注:在此每次状态元素都使用cnt%len,这样就可以使得得到的下标一直在tmp字符串的范围内

以上使用的函数usleep和sleep类似也是进行休眠,不过单位是毫秒

完整代码如下所示:

#include"process.h"    
    
    
    
    
//函数实现    
    
#define MAX 101    
#define STYLE '#'                                                                                                                                            
    
void process_v1()    
{    
    char buffer[MAX];    
    memset(buffer,0,sizeof(buffer));    
    const char* tmp="|/-";    
    int len=strlen(tmp);    
    int cnt=0;    
    while(cnt<=100)    
    {    
        printf("[%-100s][%d%%][%c]
",buffer,cnt,tmp[cnt%len]);    
        fflush(stdout);    
        usleep(50000);    
        buffer[cnt]=STYLE;    
        cnt++;    
    
    }    
    
    printf("
");    
    
    
}    

编写完process_v1的代码之后接下来就使用make命令生成对应的可执行程序process.exe


 

执行process.exe效果如下所示: 

3.2 v2版本

在上述内容中,我们已经实现了进度条的第一个版本。尽管上述进度条程序确实能够运行,但问题在于我们上面实现的进度条速度是均匀的。这在现实中几乎是不可能的情况。更多时候,进度条会呈现出速度的变化。例如,在下载文件时,由于网速的影响,网速快时进度条移动得快,网速慢时进度条移动得慢。因此,接下来实现的第二个版本的进度条将更符合实际情况。

在此创建一个process_v2来表示该版本进度条的实现

该函数的参数有两个分别为总的数据值以及当前完成任务的数据值。在该函数的内部就需要实现cur占totle总量的百分比进度条,在此数据的变化就不在该函数内实现。

首先和之前的process_v1函数类似也是先创建一个大小为101的数组buffer来存储进度条的内容,再创建一个数组tmp来存储动态变化的字符。

之后和之前实现函数不同的是使用cnt变量的值来确定对应状态数组的下标,创建一个浮点数的变量count来统计当前进度条的百分比,再使用变量sum来统计进度条内#的个数

 

完整代码如下所示:

#define MAX 101    
#define STYLE '#'    
    
void process_v2(double totle,double cur)                                                                                                                     
{    
    char buffer[MAX];    
    memset(buffer,0,sizeof(buffer));    
    const char* tmp="|/-";    
    int len=strlen(tmp);    
    static int cnt=0;    
    double count=cur*100/totle;    
    int sum=(int)count;    
    int i=0;    
    for(;i<=sum;i++)    
    {    
        buffer[i]=STYLE;    
    }    
    
    printf("[%-100s][%.1lf%%][%c]
",buffer,count,tmp[cnt]);    
    fflush(stdout);    
    cnt++;    
    cnt%=len;    
    
    
}    

实现了process_v2函数之后接下来就需要在main.c当中实现一个具体的场景,假设在此实现的是文件的下载,下载的总量是1024mb,下载的速度是0.1mb每秒,那么接下来实现的函数就如下所示:

#include"process.h"    
    
    
    
double totle=1024.0;    
double speed=1.0;    
    
    
void DownLoad()    
{                                                                                                                                                            
    double cur=0;    
    while(cur<=totle)    
    {    
        process_v2(totle,cur);    
        usleep(10000);    
        cur+=speed;    
    }    
    
}    
    
int main()    
{    
    
    //函数使用    
    
//process_v1();    
    
    DownLoad();    
    
    
    return 0;    
    
}    

执行以上代码make之后形成的可执行程序,输出结果如下所示:

 

以上虽然实现的进度条能执行下去,但是以上还是匀速的,那么此时要使得呈现出来的进度条快慢是变化就需要使用随机数。

并且还将下载总的数据量的大小由mai函数内调用DownLoad时传参。

在此之前先在process.h内引用对应的头文件

#include"process.h"                                                                                     
                                                                                     
                                                                                     
void DownLoad(double totle)                                                                                     
{    
    srand(time(NULL));    
    double speed=rand()%51;    
    double cur=0;    
    while(cur<=totle)    
    {    
        process_v2(totle,cur);    
        usleep(10000);    
        cur+=speed;    
    }    
    printf("
");    
    
}    
                                                                                                                                                             
int main()    
{    
    
    //函数使用    
                                                                                     
//process_v1();                                                                                     
                                                                                     
    DownLoad(10240);                                                                                     
                                                                                            
                                                                                            
    return 0;                                                                                     
                                                                                            
}     

以上代码此时就会存在一个问题就是最终cur的值可能会无法和totle正好匹配,那么此时最后进度条就无法显示到100%,因此接下来就要对这种情况进行处理。

在此只需要按照以上的方式处理即可实现最终的进度条到100%。 

以上实现的进度条以及基本满足我们的预期了,接下来就是对以上代码进行优化,在以上代码中DownLoad和process_v2的耦合度较高,在此我们可以修改为回调函数的方式来实现函数的调用。

并且在process_v2函数当中再添加一个变量来表示当中进度进行的操作是什么。

这样就可以实现上传等其他的操作

完整代码如下所示:

process.h

#pragma once    
#include    
#include    
#include    
#include    
#include    
    
//函数声明    
void process_v1();    
void process_v2(const char* s,double totle,double cur);                                                                                                      


process.c

#include"process.h"                                                                        
                                                                                                
                                                                                                 
                                                                                                 
                                                                                               
//函数实现                                                                                       
                                                                               
#define MAX 101                                                                          
#define STYLE '#'                                                                                
                                                                              
void process_v2(const char* s,double totle,double cur)                        
{                                                                             
    char buffer[MAX];                                                         
    memset(buffer,0,sizeof(buffer));                                          
    const char* tmp="|/-";                                                  
    int len=strlen(tmp);                                                      
    static int cnt=0;                                                         
    double count=cur*100/totle;                                               
    int sum=(int)count;                                                       
    int i=0;                                                                  
    for(;i<=sum;i++)                                                          
    {                                                                         
        buffer[i]=STYLE;                                                      
    }                                                                         
                                                                              
    printf("[%s][%-100s][%.1lf%%][%c]
",s,buffer,count,tmp[cnt]);                                                                                           
    fflush(stdout);                                                           
    cnt++;                                                                    
    cnt%=len;                                                                 
                                                                                                                                                        
}  


void process_v1()
{
    char buffer[MAX];
    memset(buffer,0,sizeof(buffer));
    const char* tmp="|/-";
    int len=strlen(tmp);
    int cnt=0;                                                                                                                                               
    while(cnt<=100)
    {
        printf("[%-100s][%d%%][%c]
",buffer,cnt,tmp[cnt%len]);
        fflush(stdout);
        usleep(50000);
        buffer[cnt]=STYLE;
        cnt++;

    }

    printf("
");


}
      

main.c

#include"process.h"


    
typedef void(*call_t)(const char*,double,double);    
void DownLoad(double totle,call_t cb)    
{    
    srand(time(NULL));    
    double speed=rand()%51;    
    double cur=0;    
    while(cur<=totle)    
    {    
        cb("下载中:",totle,cur);    
        if(cur>=totle)break;    
        usleep(1000);    
        cur+=speed;    
        if(cur>totle)cur=totle;    
    }    
    printf("
");    
    
}    
void UPLoad(double totle,call_t cb)
{
    srand(time(NULL));
    double speed=rand()%51;
    double cur=0;
    while(cur<=totle)
    {
        cb("上传中:",totle,cur);
        if(cur>=totle)break;
        usleep(1000);
        cur+=speed;
        if(cur>totle)cur=totle;    
    }    
    printf("
");
}


int main()
{                                                                                                                                                            

    //函数使用

//process_v1()
     printf("下载总量:%d
",10000);
     DownLoad(10000,process_v2);
     printf("下载总量:%d
",222222);
     DownLoad(222222,process_v2);
     printf("下载总量:%d
",99);
     DownLoad(99,process_v2);
     printf("下载总量:%d
",5555);
     DownLoad(5555,process_v2);
     printf("下载总量:%d
",1);
     DownLoad(1,process_v2);
    printf("上传总量:%d
",20000);
    UPLoad(20000,process_v2);


    return 0;

}

 

以上代码运行结果如下所示:

 

以上就是本篇的全部内容了,希望通过本篇的学习能让你对这些基础的开发工具有更深的认识

本文地址:https://www.vps345.com/5436.html

搜索文章

Tags

PV计算 带宽计算 流量带宽 服务器带宽 上行带宽 上行速率 什么是上行带宽? CC攻击 攻击怎么办 流量攻击 DDOS攻击 服务器被攻击怎么办 源IP 服务器 linux 运维 游戏 云计算 javascript 前端 chrome edge llama 算法 opencv 自然语言处理 神经网络 语言模型 进程 操作系统 进程控制 Ubuntu ssh 阿里云 网络 网络安全 网络协议 ubuntu deepseek Ollama 模型联网 API CherryStudio RTSP xop RTP RTSPServer 推流 视频 科技 ai java 人工智能 个人开发 python MCP rust http 开发语言 ssl tcp/ip fastapi mcp mcp-proxy mcp-inspector fastapi-mcp agent sse android harmonyos typescript 鸿蒙 filezilla 无法连接服务器 连接被服务器拒绝 vsftpd 331/530 YOLO efficientVIT YOLOv8替换主干网络 TOLOv8 分布式 面试 性能优化 jdk intellij-idea 架构 numpy 运维开发 云原生 华为 计算机网络 Flask FastAPI Waitress Gunicorn uWSGI Uvicorn 数据库 centos oracle 关系型 安全 宝塔面板访问不了 宝塔面板网站访问不了 宝塔面板怎么配置网站能访问 宝塔面板配置ip访问 宝塔面板配置域名访问教程 宝塔面板配置教程 物联网 mcu iot 信息与通信 vue.js audio vue音乐播放器 vue播放音频文件 Audio音频播放器自定义样式 播放暂停进度条音量调节快进快退 自定义audio覆盖默认样式 udp 客户端 后端 java-ee sqlserver mysql 自动化 websocket .net ESP32 c++ 单片机 机器学习 docker 豆瓣 追剧助手 迅雷 nas 微信 macos 向日葵 前端框架 windows 微服务 springcloud 银河麒麟 kylin v10 麒麟 v10 深度学习 目标检测 计算机视觉 LDAP 嵌入式 linux驱动开发 arm开发 嵌入式硬件 aws googlecloud vSphere vCenter 软件定义数据中心 sddc 笔记 tomcat maven intellij idea rpc jmeter 软件测试 kubernetes 容器 HCIE 数通 智能路由器 外网访问 内网穿透 端口映射 word图片自动上传 word一键转存 复制word图片 复制word图文 复制word公式 粘贴word图文 粘贴word公式 nginx dubbo .netcore gateway Clion Nova ResharperC++引擎 Centos7 远程开发 ESXi pycharm conda pillow node.js json html5 firefox rust腐蚀 AI 爬虫 数据集 WSL win11 无法解析服务器的名称或地址 ollama 大模型 mac MacOS录屏软件 学习方法 经验分享 程序人生 ide golang Dify gpu算力 asm pip DeepSeek-R1 API接口 live555 rtsp rtp Hyper-V WinRM TrustedHosts 安装教程 GPU环境配置 Ubuntu22 CUDA PyTorch Anaconda安装 vue3 HTML audio 控件组件 vue3 audio音乐播放器 Audio标签自定义样式默认 vue3播放音频文件音效音乐 自定义audio播放器样式 播放暂停调整声音大小下载文件 mount挂载磁盘 wrong fs type LVM挂载磁盘 Centos7.9 编辑器 鸿蒙系统 WSL2 计算机外设 电脑 软件需求 开源 github 创意 社区 源码剖析 rtsp实现步骤 流媒体开发 c# go 代理模式 Windsurf ai小智 语音助手 ai小智配网 ai小智教程 智能硬件 esp32语音助手 diy语音助手 cpu 内存 实时 使用 大数据 政务 分布式系统 监控运维 Prometheus Grafana 微信分享 Image wxopensdk GaN HEMT 氮化镓 单粒子烧毁 辐射损伤 辐照效应 ipython flutter react.js 前端面试题 持续部署 YOLOv8 NPU Atlas800 A300I pro asi_bench 数据挖掘 网络用户购物行为分析可视化平台 大数据毕业设计 1024程序员节 adb protobuf 序列化和反序列化 安装 统信UOS 麒麟 bonding 链路聚合 camera Arduino 电子信息 EtherCAT转Modbus ECT转Modbus协议 EtherCAT转485网关 ECT转Modbus串口网关 EtherCAT转485协议 ECT转Modbus网关 ddos c语言 qt stm32项目 stm32 chatgpt llama3 Chatglm 开源大模型 zotero WebDAV 同步失败 Dell R750XS HarmonyOS Next YOLOv12 flask spring boot AI编程 AIGC debian PVE unity dell服务器 命名管道 客户端与服务端通信 华为云 vim 温湿度数据上传到服务器 Arduino HTTP VMware安装mocOS VMware macOS系统安装 Agent 学习 sql KingBase oceanbase rc.local 开机自启 systemd uni-app 智能手机 NAS Termux Samba Linux cuda cudnn anaconda C 环境变量 进程地址空间 php postman mock mock server 模拟服务器 mock服务器 Postman内置变量 Postman随机数据 ffmpeg 音视频 pytorch 僵尸进程 vscode 工业4.0 centos-root /dev/mapper yum clean all df -h / du -sh 微信小程序 小程序 京东云 windwos防火墙 defender防火墙 win防火墙白名单 防火墙白名单效果 防火墙只允许指定应用上网 防火墙允许指定上网其它禁止 命令行 基础入门 编程 高效远程协作 TrustViewer体验 跨设备操作便利 智能远程控制 spring cloud kafka hibernate linux 命令 sed 命令 Cookie mongodb grafana prometheus IPMI 权限 DevEco Studio 开机自启动 漏洞 bash kind 微信开放平台 微信公众平台 微信公众号配置 负载均衡 宝塔面板 同步 备份 建站 安全威胁分析 redis Redis Desktop chrome 浏览器下载 chrome 下载安装 谷歌浏览器下载 virtualenv 缓存 agi dify ragflow SSH Xterminal 蓝耘科技 元生代平台工作流 ComfyUI 系统安全 bug yum源切换 更换国内yum源 远程工作 弹性计算 云服务器 裸金属服务器 弹性裸金属服务器 虚拟化 express p2p openEuler unity3d 网络穿透 雨云 NPS 飞牛NAS 飞牛OS MacBook Pro ue5 vr dns AI大模型 DeepSeek 程序员 大模型入门 恒源云 jenkins Ubuntu Server Ubuntu 22.04.5 致远OA OA服务器 服务器磁盘扩容 CPU 主板 电源 网卡 gitlab okhttp CORS 跨域 matplotlib 大模型微调 系统架构 实时音视频 半虚拟化 硬件虚拟化 Hypervisor 企业微信 Linux24.04 deepin 图像处理 Reactor 设计模式 C++ kylin arm 腾讯云 能力提升 面试宝典 技术 IT信息化 safari Mac 系统 k8s code-server MQTT mosquitto 消息队列 nvidia 服务器繁忙 microsoft 华为od django sqlite 华为认证 网络工程师 交换机 vue MS Materials openssl 密码学 监控 自动化运维 大语言模型 shell outlook kamailio sip VoIP 大数据平台 devops springboot echarts 信息可视化 数据分析 网页设计 媒体 iftop 网络流量监控 硬件架构 Docker Hub docker pull 镜像源 daemon.json elasticsearch https AISphereButler 课程设计 Deepseek 大模型教程 remote-ssh 国产操作系统 ukui 麒麟kylinos openeuler git npm pyautogui 统信 虚拟机安装 职场和发展 框架搭建 jar spring W5500 OLED u8g2 TCP服务器 安卓 Java Applet URL操作 服务器建立 Socket编程 网络文件读取 VPS pyqt Qwen2.5-coder 离线部署 微信小程序域名配置 微信小程序服务器域名 微信小程序合法域名 小程序配置业务域名 微信小程序需要域名吗 微信小程序添加域名 log4j apache threejs 3D 其他 SenseVoice RustDesk自建服务器 rustdesk服务器 docker rustdesk QQ 机器人 bot Docker web3.py web安全 服务器主板 AI芯片 飞书 孤岛惊魂4 WebRTC gpt openwrt OD机试真题 华为OD机试真题 服务器能耗统计 RTMP 应用层 mamba Vmamba jupyter 并查集 leetcode 低代码 游戏服务器 TrinityCore 魔兽世界 adobe 传统数据库升级 银行 LLMs VMware安装Ubuntu Ubuntu安装k8s Python 网络编程 聊天服务器 套接字 TCP Socket webrtc IPMITOOL BMC 硬件管理 opcua opcda KEPServer安装 oneapi FTP 服务器 医疗APP开发 app开发 k8s集群资源管理 云原生开发 NFS redhat dba pdf 群晖 文件分享 中间件 iis 多线程服务器 Linux网络编程 Cline 自动化编程 云服务 Open WebUI 可信计算技术 测试工具 springsecurity6 oauth2 授权服务器 token sas eureka 远程控制 远程看看 远程协助 visualstudio 银河麒麟操作系统 国产化 RoboVLM 通用机器人策略 VLA设计哲学 vlm fot robot 视觉语言动作模型 具身智能 无人机 rsyslog list 数据结构 服务器数据恢复 数据恢复 存储数据恢复 raid5数据恢复 磁盘阵列数据恢复 zabbix kali 共享文件夹 虚拟机 Trae IDE AI 原生集成开发环境 Trae AI selenium LLM 大模型面经 大模型学习 驱动开发 硬件工程 嵌入式实习 pygame 三级等保 服务器审计日志备份 llm 本地部署 api DigitalOcean GPU服务器购买 GPU服务器哪里有 GPU服务器 Kylin-Server 服务器安装 matlab EasyConnect bootstrap html Kali Linux 黑客 渗透测试 信息收集 ecmascript nextjs react reactjs 黑客技术 流式接口 ci/cd 压测 ECS 灵办AI ssrf 失效的访问控制 kvm wsl Google pay Apple pay android studio 交互 hadoop fpga开发 openvpn server openvpn配置教程 centos安装openvpn 代码调试 ipdb xrdp 远程桌面 远程连接 string模拟实现 深拷贝 浅拷贝 经典的string类问题 三个swap 开发环境 SSL证书 r语言 数据可视化 TRAE 环境迁移 thingsboard postgresql 视觉检测 wsl2 VMware创建虚拟机 雨云服务器 多层架构 解耦 IIS .net core Hosting Bundle .NET Framework vs2022 直播推流 gitee 毕设 ros2 moveit 机器人运动 状态管理的 UDP 服务器 Arduino RTOS telnet 远程登录 yum gitea gpt-3 文心一言 C语言 svn 串口服务器 分析解读 css 腾讯云大模型知识引擎 命令 k8s资源监控 annotations自动化 自动化监控 监控service 监控jvm Invalid Host allowedHosts 实战案例 gradle Wi-Fi C# MQTTS 双向认证 emqx 拓扑图 KylinV10 麒麟操作系统 Vmware mybatis Java 云电竞 云电脑 todesk 压力测试 小艺 Pura X excel transformer ping++ iBMC UltraISO docker搭建nacos详解 docker部署nacos docker安装nacos 腾讯云搭建nacos centos7搭建nacos 自动驾驶 springboot远程调试 java项目远程debug docker远程debug java项目远程调试 springboot远程 强制清理 强制删除 mac废纸篓 Ark-TS语言 RAID RAID技术 磁盘 存储 ssh漏洞 ssh9.9p2 CVE-2025-23419 部署 多进程 AI代码编辑器 cmos 硬件 测试用例 功能测试 磁盘监控 服务器配置 rabbitmq KVM 生物信息学 tcpdump ansible playbook 剧本 visual studio code 远程 执行 sshpass 操作 博客 rdp 实验 AP配网 AK配网 小程序AP配网和AK配网教程 WIFI设备配网小程序UDP开 王者荣耀 etcd 数据安全 RBAC wireshark DNS 金融 unix ArcTS 登录 ArcUI GridItem mariadb arkUI 报错 rag ragflow 源码启动 设备 GPU PCI-Express 产品经理 Portainer搭建 Portainer使用 Portainer使用详解 Portainer详解 Portainer portainer ue4 着色器 虚幻 Linux无人智慧超市 LInux多线程服务器 QT项目 LInux项目 单片机项目 UOS 统信操作系统 JAVA 深度优先 图论 并集查找 换根法 树上倍增 SWAT 配置文件 服务管理 网络共享 gaussdb ruoyi DeepSeek行业应用 Heroku 网站部署 小游戏 五子棋 游戏机 ocr asp.net大文件上传 asp.net大文件上传源码 ASP.NET断点续传 asp.net上传文件夹 asp.net上传大文件 .net core断点续传 .net mvc断点续传 micropython esp32 mqtt 进程信号 nuxt3 软件工程 实时互动 IIS服务器 IIS性能 日志监控 next.js 部署next.js 服务器管理 配置教程 网站管理 银河麒麟服务器操作系统 系统激活 ollama下载加速 n8n 工作流 workflow 算力 蓝桥杯 firewalld mysql离线安装 ubuntu22.04 mysql8.0 源码 毕业设计 矩阵 安全架构 网络攻击模型 混合开发 环境安装 JDK 计算虚拟化 弹性裸金属 edge浏览器 银河麒麟高级服务器 外接硬盘 Kylin GCC crosstool-ng 社交电子 数据库系统 SSH 密钥生成 SSH 公钥 私钥 生成 hive Hive环境搭建 hive3环境 Hive远程模式 EMQX 通信协议 小智AI服务端 xiaozhi ASR TTS 直流充电桩 充电桩 ShenTong AD 域管理 SEO 网站搭建 serv00 chfs ubuntu 16.04 自动化任务管理 flash-attention 显示管理器 lightdm gdm 私有化 vscode 1.86 火绒安全 代理 Nuxt.js frp 内网服务器 内网代理 内网通信 fd 文件描述符 MySql 链表 线程 rclone AList webdav fnOS jvm cnn uniapp 邮件APP 免费软件 上传视频至服务器代码 vue3批量上传多个视频并预览 如何实现将本地视频上传到网页 element plu视频上传 ant design vue vue3本地上传视频及预览移除 计算机 备选 网站 调用 示例 AD域 mq rocketmq x64 SIGSEGV SSE xmm0 ip命令 新增网卡 新增IP 启动网卡 miniapp 真机调试 调试 debug 断点 网络API请求调试方法 边缘计算 minio AutoDL 指令 模拟退火算法 pgpool 端口测试 deepseek r1 田俊楠 Linux的权限 办公自动化 自动化生成 pdf教程 业界资讯 鲲鹏 make命令 makefile文件 ios iphone 设置代理 实用教程 华为机试 arcgis Ubuntu DeepSeek DeepSeek Ubuntu DeepSeek 本地部署 DeepSeek 知识库 DeepSeek 私有化知识库 本地部署 DeepSeek DeepSeek 私有化部署 自定义客户端 SAS 集成学习 集成测试 SSH 服务 SSH Server OpenSSH Server 相机 模拟实现 Jellyfin 游戏程序 回显服务器 UDP的API使用 WebUI DeepSeek V3 运维监控 做raid 装系统 armbian u-boot ftp web 升级 CVE-2024-7347 rustdesk DenseNet VM搭建win2012 win2012应急响应靶机搭建 攻击者获取服务器权限 上传wakaung病毒 应急响应并溯源 挖矿病毒处置 应急响应综合性靶场 CrewAI 文件系统 路径解析 qemu libvirt AI写作 prompt minicom 串口调试工具 MI300x web3 ruby GoogLeNet tcp ux 多线程 vscode1.86 1.86版本 ssh远程连接 open Euler dde LLM Web APP Streamlit 版本 gcc big data opensearch helm open webui 信号处理 IMM 智能音箱 智能家居 CH340 串口驱动 CH341 uart 485 北亚数据恢复 oracle数据恢复 单一职责原则 RAGFLOW RAG 检索增强生成 文档解析 大模型垂直应用 docker命令大全 DocFlow XCC Lenovo 输入法 spark HistoryServer Spark YARN jobhistory 繁忙 解决办法 替代网站 汇总推荐 AI推理 bcompare Beyond Compare asp.net大文件上传下载 VSCode 移动云 centos 7 怎么卸载MySQL MySQL怎么卸载干净 MySQL卸载重新安装教程 MySQL5.7卸载 Linux卸载MySQL8.0 如何卸载MySQL教程 MySQL卸载与安装 skynet IM即时通讯 剪切板对通 HTML FORMAT 监控k8s 监控kubernetes ui zookeeper nfs 服务器部署ai模型 embedding SSL 域名 Anolis nginx安装 linux插件下载 技能大赛 cursor langchain deep learning Ubuntu 24 常用命令 Ubuntu 24 Ubuntu vi 异常处理 ldap linux安装配置 linux环境变量 3d GIS 遥感 WebGIS c 阿里云ECS dity make LORA NLP EMUI 回退 降级 显示过滤器 ICMP Wireshark安装 大大通 第三代半导体 碳化硅 Windows ai工具 v10 软件 反向代理 图形化界面 多个客户端访问 IO多路复用 TCP相关API 单元测试 rime h.264 apt URL Docker Compose docker compose docker-compose 搜索引擎 小番茄C盘清理 便捷易用C盘清理工具 小番茄C盘清理的优势尽显何处? 教你深度体验小番茄C盘清理 C盘变红?!不知所措? C盘瘦身后电脑会发生什么变化? 网卡的名称修改 eth0 ens33 Linux awk awk函数 awk结构 awk内置变量 awk参数 awk脚本 awk详解 大文件分片上传断点续传及进度条 如何批量上传超大文件并显示进度 axios大文件切片上传详细教 node服务器合并切片 vue3大文件上传报错提示错误 大文件秒传跨域报错cors 网工 vue-i18n 国际化多语言 vue2中英文切换详细教程 如何动态加载i18n语言包 把语言json放到服务器调用 前端调用api获取语言配置文件 5G 3GPP 卫星通信 SRS 流媒体 直播 换源 国内源 Debian 监控k8s集群 集群内prometheus Deepseek-R1 私有化部署 推理模型 elk 远程服务 tidb GLIBC 常用命令 文本命令 目录命令 崖山数据库 YashanDB python3.11 视频编解码 Ubuntu 24.04.1 轻量级服务器 dash 正则表达式 ROS docker run 数据卷挂载 交互模式 tensorflow trae 自动化测试 性能测试 odoo 服务器动作 Server action sqlite3 netty 远程过程调用 Windows环境 虚拟局域网 ceph selete 高级IO es 高效日志打印 串口通信日志 服务器日志 系统状态监控日志 异常记录日志 信创 信创终端 中科方德 相差8小时 UTC 时间 云桌面 微软 AD域控 证书服务器 无桌面 risc-v wordpress 无法访问wordpess后台 打开网站页面错乱 linux宝塔面板 wordpress更换服务器 Claude eNSP 网络规划 VLAN 企业网络 显卡驱动 AnythingLLM AnythingLLM安装 交叉编译 swoole FTP服务器 联想开天P90Z装win10 序列化反序列化 匿名管道 人工智能生成内容 我的世界 我的世界联机 数码 软考 ecm bpm 宕机切换 服务器宕机 MacMini 迷你主机 mini Apple openstack Xen webstorm 宠物 免费学习 宠物领养 宠物平台 执法记录仪 智能安全帽 smarteye 游戏引擎 SysBench 基准测试 数据库架构 数据管理 数据治理 数据编织 数据虚拟化 P2P HDLC 思科 nac 802.1 portal idm Minecraft linux上传下载 昇腾 npu DOIT 四博智联 QT 5.12.12 QT开发环境 Ubuntu18.04 USB网络共享 Playwright 音乐服务器 Navidrome 音流 MCP server C/S aarch64 编译安装 HPC windows日志 uv H3C iDRAC R720xd 程序员创富 树莓派 VNC xml 程序 性能分析 freebsd MQTT协议 消息服务器 代码 VR手套 数据手套 动捕手套 动捕数据手套 vmware 卡死 网络结构图 服务器无法访问 ip地址无法访问 无法访问宝塔面板 宝塔面板打不开 虚拟显示器 XFS xfs文件系统损坏 I_O error wps av1 电视盒子 机顶盒ROM 魔百盒刷机 前后端分离 数学建模 重启 排查 系统重启 日志 原因 xshell termius iterm2 深度求索 私域 知识库 neo4j 数据仓库 数据库开发 database uni-file-picker 拍摄从相册选择 uni.uploadFile H5上传图片 微信小程序上传图片 FunASR file server http server web server rnn keepalived ros muduo 个人博客 X11 Xming sonoma 自动更新 技术共享 jina chrome devtools chromedriver Docker引擎已经停止 Docker无法使用 WSL进度一直是0 镜像加速地址 seatunnel DBeaver kerberos 英语 目标跟踪 OpenVINO 推理应用 ISO镜像作为本地源 xcode 系统开发 binder 车载系统 framework 源码环境 产测工具框架 IMX6ULL 管理框架 Cursor 阻塞队列 生产者消费者模型 服务器崩坏原因 jetty undertow seleium grub 版本升级 扩容 磁盘镜像 服务器镜像 服务器实时复制 实时文件备份 Linux PID Erlang OTP gen_server 热代码交换 事务语义 MNN Qwen ip LInux 备份SQL Server数据库 数据库备份 傲梅企业备份网络版 Netty 即时通信 NIO sdkman lio-sam SLAM Dell HPE 联想 浪潮 HTTP 服务器控制 ESP32 DeepSeek glibc dns是什么 如何设置电脑dns dns应该如何设置 银河麒麟桌面操作系统 Kylin OS 在线预览 xlsx xls文件 在浏览器直接打开解析xls表格 前端实现vue3打开excel 文件地址url或接口文档流二进 OpenManus 迁移指南 图形渲染 宝塔 黑苹果 pppoe radius hugo AI agent 软负载 思科模拟器 Cisco HiCar CarLife+ CarPlay QT RK3588 yolov8 CLion Node-Red 编程工具 流编程 vasp安装 alias unalias 别名 AI作画 聊天室 国标28181 视频监控 监控接入 语音广播 流程 SIP SDP curl wget 大模型应用 epoll Radius qt项目 qt项目实战 qt教程 本地化部署 nlp HarmonyOS 考研 物联网开发 根服务器 clickhouse IPv4 子网掩码 公网IP 私有IP docker部署翻译组件 docker部署deepl docker搭建deepl java对接deepl 翻译组件使用 UOS1070e VS Code webgl HAProxy junit 玩机技巧 软件分享 软件图标 easyui laravel 飞牛nas fnos 需求分析 规格说明书 Linux的基础指令 harmonyOS面试题 毕昇JDK sublime text DeepSeek r1 我的世界服务器搭建 minecraft autodl 移动魔百盒 USB转串口 策略模式 单例模式 历史版本 下载 etl AI-native Docker Desktop 免费域名 域名解析 查询数据库服务IP地址 SQL Server 语音识别 eclipse 飞牛 EtherNet/IP串口网关 EIP转RS485 EIP转Modbus EtherNet/IP网关协议 EIP转RS485网关 EIP串口服务器 bat 李心怡 wpf Doris搭建 docker搭建Doris Doris搭建过程 linux搭建Doris Doris搭建详细步骤 Doris部署 g++ g++13 影刀 #影刀RPA# docker部署Python flink WSL2 上安装 Ubuntu c/c++ 串口 vpn idea 用户缓冲区 镜像 企业网络规划 华为eNSP 支付 微信支付 开放平台 ArkTs ArkUI PX4 存储维护 NetApp存储 EMC存储 软链接 硬链接 TrueLicense java-rocketmq Mac内存不够用怎么办 cocoapods onlyoffice 超融合 进程优先级 调度队列 进程切换 banner figma 推荐算法 项目部署到linux服务器 项目部署过程 less 增强现实 沉浸式体验 应用场景 技术实现 案例分析 AR Xinference RAGFlow Attention Kali 渗透 cd 目录切换 ubuntu24 vivado24 网络药理学 生信 gromacs 分子动力学模拟 MD 动力学模拟 sysctl.conf vm.nr_hugepages 虚幻引擎 virtualbox su sudo xpath定位元素 CDN Headless Linux 模拟器 教程 Ubuntu22.04 开发人员主页 trea 僵尸世界大战 游戏服务器搭建 健康医疗 lsb_release /etc/issue /proc/version uname -r 查看ubuntu版本 saltstack 代码托管服务 WLAN rancher 区块链 实习 键盘 嵌入式Linux IPC gnu 架构与原理 searxng 多端开发 智慧分发 应用生态 鸿蒙OS PPI String Cytoscape CytoHubba 内网环境 嵌入式系统开发 WebVM 流水线 脚本式流水线 代理服务器 中兴光猫 换光猫 网络桥接 自己换光猫 抗锯齿 nftables 防火墙 互信 firewall 金仓数据库 2025 征文 数据库平替用金仓 cpp-httplib 像素流送api 像素流送UE4 像素流送卡顿 像素流送并发支持 Typore 元服务 应用上架 NAT转发 NAT Server Unity Dedicated Server Host Client 无头主机 浏览器开发 AI浏览器 稳定性 看门狗 大模型部署 聚类 db 安防软件 css3 本地知识库部署 DeepSeek R1 模型 sentinel 知识图谱 本地环回 bind deekseek 强化学习 midjourney Python基础 Python教程 Python技巧 powerpoint 环境配置 佛山戴尔服务器维修 佛山三水服务器维修 基础环境 加解密 Yakit yaklang ubuntu20.04 开机黑屏 主从复制 信号 干货分享 黑客工具 密码爆破 Linux环境 CentOS 服务器时间 IDEA 沙盒 C++软件实战问题排查经验分享 0xfeeefeee 0xcdcdcdcd 动态库加载失败 程序启动失败 程序运行权限 标准用户权限与管理员权限 can 线程池 tailscale derp derper 中转 cfssl triton 模型分析 线性代数 电商平台 虚拟现实 ssh远程登录 互联网医院 双系统 GRUB引导 Linux技巧 lua 域名服务 DHCP 符号链接 配置 hosts 音乐库 iventoy VmWare OpenEuler 软件构建 IO模型 7z dock 加速 yaml Ultralytics 可视化 OpenSSH Spring Security perf 服务网格 istio rtsp服务器 rtsp server android rtsp服务 安卓rtsp服务器 移动端rtsp服务 大牛直播SDK Ubuntu共享文件夹 共享目录 Linux共享文件夹 TCP协议 游戏开发 IMX317 MIPI H265 VCU composer 带外管理 k8s二次开发 集群管理 上传视频文件到服务器 uniApp本地上传视频并预览 uniapp移动端h5网页 uniapp微信小程序上传视频 uniapp app端视频上传 uniapp uview组件库 开发 语法 本地部署AI大模型 大模型推理 OpenHarmony Logstash 日志采集 sequoiaDB 捆绑 链接 谷歌浏览器 youtube google gmail xss llama.cpp react native CentOS Stream 自学笔记 小米 澎湃OS Android DIFY 分布式训练 ubuntu24.04.1 网络建设与运维 NLP模型 prometheus数据采集 prometheus数据模型 prometheus特点 fast regedit 开机启动 端口 查看 ss 读写锁 AI Agent 字节智能运维 yolov5 在线office 离线部署dify word 隐藏文件 隐藏目录 管理器 通配符 WebServer rpa hexo visual studio Linux find grep 钉钉 磁盘清理 AI员工 软件卸载 系统清理 抓包工具 Linux权限 权限命令 特殊权限 热榜 perl MAC SecureCRT 视频平台 录像 视频转发 视频流 粘包问题 wsgiref Web 服务器网关接口 MDK 嵌入式开发工具 论文笔记 ABAP vnc UEFI Legacy MBR GPT U盘安装操作系统 nosql ardunio BLE MacOS zip unzip Linux 维护模式 navicat 网络爬虫 电视剧收视率分析与可视化平台 Web服务器 多线程下载工具 PYTHON kotlin kernel Sealos MAVROS 四旋翼无人机 论文阅读 烟花代码 烟花 元旦 网络搭建 神州数码 神州数码云平台 云平台 copilot ip协议 安装MySQL 通信工程 毕业 ranger MySQL8.0 极限编程 问题解决 大模型技术 本地部署大模型 Reactor反应堆 linux内核 conda配置 conda镜像源 MVS 海康威视相机 mcp服务器 client close iperf3 带宽测试 ubuntu 18.04 ArtTS 性能调优 安全代理 lb 协议 查看显卡进程 fuser proxy模式 搭建个人相关服务器 浏览器自动化 nvm whistle 智能电视 风扇控制软件 容器技术 UDP 流量运营 多路转接 docker搭建pg docker搭建pgsql pg授权 postgresql使用 postgresql搭建 欧标 OCPP 服务器安全 网络安全策略 防御服务器攻击 安全威胁和解决方案 程序员博客保护 数据保护 安全最佳实践 mm-wiki搭建 linux搭建mm-wiki mm-wiki搭建与使用 mm-wiki使用 mm-wiki详解 vu大文件秒传跨域报错cors 项目部署 Unity插件 IO 机柜 1U 2U deployment daemonset statefulset cronjob React Next.js 开源框架 HarmonyOS NEXT 原生鸿蒙 云耀服务器 计算生物学 生物信息 基因组 Qwen2.5-VL vllm 合成模型 扩散模型 图像生成 fstab 国产数据库 瀚高数据库 数据迁移 下载安装 对比 工具 meld DiffMerge 鸿蒙开发 移动开发 top Linux top top命令详解 top命令重点 top常用参数 端口聚合 windows11 milvus 达梦 DM8 ros1 Noetic 20.04 apt 安装 win服务器架设 windows server System V共享内存 进程通信 docker desktop image 话题通信 服务通信 SVN Server tortoise svn 状态模式 notepad 硅基流动 ChatBox 服务器正确解析请求体 解决方案 智慧农业 开源鸿蒙 团队开发 服务器扩容没有扩容成功 yum换源 MobaXterm windows 服务器安装 java-rabbitmq 西门子PLC 通讯 CosyVoice fork wait waitpid exit WINCC ebpf uprobe 内核 samba 安卓模拟器 export import save load 迁移镜像 macOS 宝塔面板无法访问 js 搜狗输入法 中文输入法 powerbi 数字证书 签署证书 开源软件 接口优化