最新资讯

  • 【Linux篇章】进程通信黑科技:System V 共享内存,开启进程间通信的星际数据通道!

【Linux篇章】进程通信黑科技:System V 共享内存,开启进程间通信的星际数据通道!

2025-04-30 07:37:33 0 阅读

在计算机系统里,进程就像一个个独立工作的小员工,各自完成自己的任务。但有时候,这些小员工之间需要交流信息、共享数据,这就涉及到进程间通信(IPC)。System V 共享内存就是进程间通信的一种强大方式,下面就带大家了解一下它的奥秘。

 欢迎阅读!!!

羑悻的小杀马特.-CSDN博客

  欢迎拜访:羑悻的小杀马特.-CSDN博客

本篇主题:秒懂百科之探秘进程通信之System V共享内存

制作日期:2025.04.29

隶属专栏:linux之旅

目录

一·什么是共享内存:

1.1共享内存概念及外观:

1.2共享内存数据结构:

二·为什么需要共享内存: 

三·共享内存相关使用的指令及函数:

3.1相关指令:

3.1.1查看共享内存:

3.1.2删除共享内存:

3.1.3 删除全部共享内存:

3.2使用共享内存函数:

3.2.1ftok:

3.2.2shmget:

3.2.3shmat:

3.2.4shmdt:

3.2.5shmctl:

四·共享内存优缺点:

4.1优点:

4.2缺点:

五·共享内存重要小tip: 

六·基于共享内存实现的进程通信:

6.1无手动输入的通信:

 define.hpp:

fifo.hpp:

shm.hpp:

client.cc:

server.cc:

Makefile:

6.2访问控制板的通信: 

更改后的client.cc:

七.小结:


一·什么是共享内存:

本质:也是让不同进程看到同一份资源。

1.1共享内存概念及外观:

想象有一个公共的大黑板,不同的进程都可以在这个黑板上写东西和看东西,这个大黑板就类似于 System V 共享内存。它允许不同的进程访问同一块物理内存区域,进程可以直接在这块内存中读写数据,而不需要进行繁琐的数据复制操作,这使得数据的传输速度非常快。(shm  -->system shared memory)

那么此时就需要“先描述,后组织”;把这些shm用各自的结构体给组织起来(这里我们可以认为是链表然后有多个进程用它;那么就会存在引用计数(nattach)来明确这块共享内存当没有进程使用的时候就销毁它;后面我们会讲如何操作)。

这里我们的动态库加载也是用的共享内存但是是mmap映射方式罢了(了解即可)。

1.2共享内存数据结构:

这里我们可以用man  shmctl 这个指令来查看:

下面我们就来看一下上面说的描述共享内存的结构体吧:

struct shmid_ds {
               struct ipc_perm shm_perm;    /* Ownership and permissions */
               size_t          shm_segsz;   /* Size of segment (bytes) */
               time_t          shm_atime;   /* Last attach time */
               time_t          shm_dtime;   /* Last detach time */
               time_t          shm_ctime;   /* Creation time/time of last
                                               modification via shmctl() */
               pid_t           shm_cpid;    /* PID of creator */
               pid_t           shm_lpid;    /* PID of last shmat(2)/shmdt(2) */
               shmatt_t        shm_nattch;  /* No. of current attaches */
               ...
           };
struct ipc_perm {
               key_t          __key;    /* Key supplied to shmget(2) */
               uid_t          uid;      /* Effective UID of owner */
               gid_t          gid;      /* Effective GID of owner */
               uid_t          cuid;     /* Effective UID of creator */
               gid_t          cgid;     /* Effective GID of creator */
               unsigned short mode;     /* Permissions + SHM_DEST and
                                           SHM_LOCKED flags */
               unsigned short __seq;    /* Sequence number */
           };

 也就是说当我们创建好共享内存的话;以及然后与想要通信的进程关联就需要填充这些数据等。

二·为什么需要共享内存: 

传统的进程间通信方式,比如管道、消息队列等,在数据传输时需要将数据从一个进程的内存复制到内核空间,再从内核空间复制到另一个进程的内存,这个过程比较耗时。而共享内存直接让多个进程访问同一块内存,避免了多次数据复制,大大提高了数据传输的效率。就好比大家都围在一个大黑板前交流,比一个人把信息写在纸条上,再传递给另一个人要快得多。

共享内存区是最快的IPC形式。⼀旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执⾏进⼊内核的系统调⽤来传递彼此的数据。

三·共享内存相关使用的指令及函数:

3.1相关指令:

3.1.1查看共享内存:

ipcs -m + shmid(共享内存编号)

3.1.2删除共享内存:

ipcrm -m + shmid(共享内存编号)

下面我们删除shmid为36的这个共享内存: 

 

这样就被销毁了。 

这里我们只能用shmid来操控共享内存而不能是key(后面会说);而且进程退出!=shm回收;还是需要手动指令回收或者函数来回收。

3.1.3 删除全部共享内存:

ipcrm -a 

使用 ipcrm -a 可以一次性删除系统中所有类型的 IPC 资源。

不过需要注意的是,执行该命令需要有足够的权限。通常情况下,普通用户只能删除自己创建的 IPC 资源,而要删除系统中所有的 IPC 资源,需要以超级用户(root)的身份执行该命令,所以实际操作中一般会这样使用:

sudo ipcrm -a

ipc指令拓展:

 删除所有消息队列:使用 ipcrm -q 选项,命令格式为 sudo ipcrm -q (需 root 权限)。

删除所有共享内存段:使用 ipcrm -m 选项,命令格式为 sudo ipcrm -m (需 root 权限)。

删除所有信号量集:使用 ipcrm -s 选项,命令格式为 sudo ipcrm -s (需 root 权限)。

3.2使用共享内存函数:

3.2.1ftok:

即file to key :

生成特定的key作为shmget创建的共享内存的唯一性标识(无其他作用是标识唯一性)。

 #include 
 #include 

  key_t ftok(const char *pathname, int proj_id);

pathname∶这是一个指向现有文件或目录的路径名的指针。该文件或目录必须存在且调用进程对其有访问权限,因为ftok会使用该文件的索引节点号(inode number)来生成键值。 

proj_id:这是一个用户指定的项目ID,它是一个非零的8位整数(取值范围是1-255)。ftok会将该值的低8位与pathname对应的文件的索引节点号组合起来生成最终的键值。 

我们需要第一个数据需要的是存在的路径(因为会借助inode等来通过一定方式生成key);第二个是一个八位的数字。 

成功就返回32位的键值;失败就返回-1。

3.2.2shmget:

即shm get(内存中创建共享内存):

 #include 
 #include 

  int shmget(key_t key, size_t size, int shmflg);

key:这个共享内存段名字。

size:共享内存⼤⼩。

shmflg:由九个权限标志构成,它们的⽤法和创建⽂件时使⽤的mode模式标志是⼀样的取值为IPC_CREAT: 共享内存不存在,创建并返回;共享内存已存在,获取并返回。

取值为IPC_CREAT | IPC_EXCL: 共享内存不存在,创建并返回;共享内存已存在,出

错返回。

返回值:成功返回⼀个⾮负整数(shmid),即该共享内存段的标识码;失败返回-1。

对于size:以4kb倍数开辟:但是如果传入的不是;它也会开辟4kb倍数;只是给用户的还是他输入的值;其实开的多只是不允许访问 。

 当然了shmflg也可以配合权限掩码使用;就是这块共享内存允许谁操作:

3.2.3shmat:

即shm attach(共享内存关联):

#include 
  #include 

  void *shmat(int shmid, const void *shmaddr, int shmflg);
shmid: 共享内存标识

shmaddr:指定连接的地址(默认传nullptr)                                                                                                                                                                                                                               shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY(默认0:可读可写)

返回值:成功返回⼀个指针,指向共享内存第⼀个节;失败返回-1(void*强转)

 

对于传入的shmflg是SHM_RDONLY就是只读了(映射到的虚拟内存空间);不过;我们这个参数一般都是默认0。 

3.2.4shmdt:

即shm detach(取消关联):

 #include 
 #include 

 void *shmat(int shmid, const void *shmaddr, int shmflg);

 shmaddr: 由shmat所返回的指针返回值:成功返回0;失败返回-1

注意:将共享内存段与当前进程脱离不等于删除共享内存段(还是需要用shmctl或者ipcrm -m来删除的(删除前必须确保已经detach了))

进程直接异常退出等它不会减少nattch;只有手动去shmdt才行否则后序的shmctl的rmid会出问题 。

3.2.5shmctl:

即shm control (控制共享内存:分为删除,获取信息,改变权限):

 #include 
  #include 

  int shmctl(int shmid, int cmd, struct shmid_ds *buf);

 shmid:由shmget返回的共享内存标识码。

cmd:将要采取的动作(有三个可取值)                                                                                                                                                                                                                                 buf:指向⼀个保存着共享内存的模式状态和访问权限的数据结构(默认传nullptr;不关心这个输出型参数)

返回值:成功返回0;失败返回-1。

 

下面我们基于写好的共享内存创建的代码来验证一下(利用上面所展示的共享内存的数据结构的结构体):

IPC_RMID这里就不需要了(每次建立共享内存后就需要删除;我们看后面实现代码效果就好了)

来演示下剩下的两个:

IPC_STAT(status):

首先在我们的shm类中添加成员函数:

 

下面我们从外部查看一下是否能把这个共享内存的信息放到传入的ds中:

 

也是显示出来的。

IPC_SET:

这里注意共享内存权限是只能修改:

我们的目的是通过传入更改共享内存的权限:mode。

这里我们默认创建的权限掩码是0666;我们打算把它修改成0006:

 运行一下:

 也是可以修改的。

四·共享内存优缺点:

4.1优点:

速度快:避免了数据的多次复制,数据传输效率高。

使用方便:进程可以像操作普通内存一样操作共享内存。

4.2缺点:

同步问题:由于多个进程可以同时访问共享内存,可能会出现数据竞争的问题。比如,一个进程正在写入数据,另一个进程同时读取数据,可能会导致数据不一致。这就需要使用其他的同步机制,如信号量,来保证数据的一致性。

管理复杂:需要手动管理共享内存的创建、连接、分离和删除,容易出现内存泄漏等问题。System V 共享内存是一种强大的进程间通信方式,它为进程之间的高效数据共享提供了可能。但在使用时,需要注意同步和管理问题,以确保系统的稳定性和数据的一致性。通过合理使用 System V 共享内存,我们可以让不同的进程更好地协作,共同完成复杂任务。

 不同步的例子:

也就是说shm不会阻塞住它是一直读的;读取的内容可能不是我们期望的;比如:我们想让它读一句话;你好;我走了。 然而如果没控制好让它什么时候读它就有可能只读你好;之后才会说我走了;不连贯。

 简单来说就是:速度快;不需要等待;写到虚拟内存空间就马上读;但是正是因为这一点;导致读写可能会出现一些错误(不是我们所需的)--->无读写的同步性;只能自己控制;以及管理起来还是比管道要困难;即对共享内存里的数据无保护机制。

那么我们如何用最简单的方法增强这种同步性;让它读取我们需要的内容呢?

那就是我们之前学的命名管道了(传送门:【Linux篇章】进程通信黑科技:匿名管道的暗码传递与命名管道的实名使命-CSDN博客 )

可以使用命名管道:当我们写进程想让它读的时候就从管道写入;当读进程发现管道有数据时候才会读shm内容(但是有很多细节注意先后顺序; sleep时候的时间等;一定控制好让它读完一条再写{而不是读这一条呢;然后shm内又被写端写入了}) 

五·共享内存重要小tip: 

①shm不随进程属于内核;也就是进程终止它仍旧存在;受内核管控必须指令清除或者代码清除。 (这也就是共享内存的特性了)

②与文件相关但又不强相关: shmid fd但是文件fd关了可以重新再开始而shm清除后下一个后从它此时的mid累加。 

下面我们演示一下:

我们知道如果是文件:比如创建一个fd就是3的话删除它再传进还是3;但是共享内存的shmid就不一样了;没有这种特性。

此时我们创建了一个共享内存shmid为37;下面我们把它删除再创建一个。

 发现变成了38而不是像我们文件一样是37。

③其次和管道不同的是:管道需要掉系统open等接口进行操作;而shm直接映射到进程的虚拟地址空间这样用户就可以直接使用(语言封装的函数等)

对应管道操作;我们不难发现它使用了open;write等系统调用:

但是对应共享内存的话我们直接就用的是封装好的用户层参数直接向着虚拟内存空间操作:

因为我们如果共享内存完成映射后;就到了进程的虚拟内存空间;这不就类似我们以前语言函数操作创建变量的形式了;但是如果是管道的话它是一个特殊文件(我们需要用系统的接口去执行)。 

④key在用户层只是区分不同shm的;用户还是用shmid来操作shm。

我们用ftok特殊方式生成的key只是共享内存的唯一标识;方便找到同一块内共享内存以及Os管理共享内存;无其他的用处;使用共享内存给用户层的还是shmid(类似文件的fd)。

⑤这里说一下;如果是进程异常退出导致的共享内存没有删除或者有nattch的时候把它删除(ipcrm或者shmctl)那么之后还是会有个dest标记如:

(ipcrm -m 或者shmctl -->如果有关联它们都会标记dest(待删除状态)【表示这块内存不能再被使用了】)
但是先前关联过的进程还是可以用;只是后面无法再与它关联;当与它关联的都shmdt掉;就会被立即释放。

共享内存底层大致是怎么样实现的呢?

下面我们粗略的说一下:

 首先我们调用的是shmget;它会在共享内存的那个结构体有个文件指针;开辟一个struct_file以及对应的缓冲区(只不过连接到了物理内存而不是磁盘);然后我们调用了shmat完成虚拟映射:其实就是把进程中mm结构体里的vm结构体的vm*file指向这个struct_file;此时就相当于把vm中虚拟地址的start和and指向了这个块缓冲区(这里可以理解成完成了我们对应页表的映射;也就是我们只需要用语言封装的函数向虚拟地址指向的位置进行操作;那么它就会自己转化到缓冲区写入然后到物理内存--->其实就是省去了对文件的系统性操作)

六·基于共享内存实现的进程通信:

下面我们基于使用上面的共享内存来完成对进程间交流代码的实现:

6.1无手动输入的通信:

下面我们基于命名管道改进它的非同步性的通信方式的代码(这里我们要求client进行写入aa cc...)然后让server读取;而不是当client写了一个server就读(a aa aaac这样的)。然后等client端写完就给server一个命令告诉它写完了;server就可以关闭命名管道以及回收共享内存了(这里一定要注意的是server和client谁先时候执行代码的时间问题;否则将会出现bug

下面我们运行一下:

下面有一些细节问题就是client和server这两个端怎么设计交流以及命名管道和共享内存如何创建的细节问题(多个初始化及析构顺序问题)请看代码:

 define.hpp:

这里因为fifo.hpp以及shm.hpp都会用到这个宏;不让它重复使用直接搞成头文让它只包含一次就好。

#pragma once
#define EXIT(e) do { perror(e);exit(EXIT_FAILURE);}while(0)

fifo.hpp:

#pragma once  
#include 
#include 
#include 
#include 
#include 
#include
using namespace std; 


class cnpipe{
   public:
    cnpipe(const string & path,const string & name):_path(path),_name(name)
     {   _pfname=_path+"/"+_name;
        umask(0);
        int n=mkfifo(_pfname.c_str(),0666);
          if (n != 0)
        {
          EXIT("mkdir");
           
        }
        
     }
     ~cnpipe(){
        int u=unlink(_pfname.c_str());
        if(u==0) std::cout<<"成功删除管道"<0) std:: cout<<"客户说:"<0) close(_fd);
    }

    private:
    string _path;
    string _name;
    string _pfname;
    int _fd;

};

shm.hpp:

#pragma once
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define projid 0x66
#define pathname "."
#define USER "user"
#define CREATER "creater"
using namespace std;


class shm{
public:
     shm(const string &pn, int pd,const string &name,int sz=4097):_name(name),_size(sz)
           {
            _key=ftok(pn.c_str(),pd);
            if(_name==USER) {  get(); }
            else if(_name==CREATER) {  create();}
            else{}
            attach();
           }

         void get(){
            corgshm(IPC_CREAT|0666);
         }

         void create(){
            corgshm(IPC_CREAT|IPC_EXCL|0666);
         }

         int sz(){
            return _size;
         }

         void * address(){
            return _mem_address;
         }
       void  getdata
       (struct shmid_ds *pds){
             shmctl(_shmid,IPC_STAT,pds);
         }
         void modifyshm(struct shmid_ds *pds){
             shmctl(_shmid,IPC_SET,pds);
               
         }
         

    ~shm(){
        int n=shmdt(_mem_address);
        if(n==-1) EXIT("shmdt");
       if(_name==CREATER) {
        destroy();
        cout<<"~shm success"<

client.cc:

#include"define.hpp"
#include"shm.hpp"
#include"fifo.hpp"

int main(){
    shm sm(pathname,projid,USER);
   oppipe op(".","ff");
   op.openw();
    char*as=(char *)sm.address();
    for(char ch='a';ch<='z';ch+=2){
        sleep(2);
        as[ch-'a']=ch;
        sleep(1);
        as[ch-'a'+1]=ch;
        as[ch+2]=0;
        op.wakeup_server();
    }
    op.exit_server();
    return 0;
    

}

server.cc:

#include"define.hpp"
#include"shm.hpp"
#include"fifo.hpp"
int main(){
    shm sm(pathname,projid,CREATER);
    struct shmid_ds ds;
    //测试IPC_STAT:
    // sm.getdata(&ds);
    // cout<

Makefile:

.PHONY:all
all:client server
client:client.cc
	g++ -o $@ $^ -std=c++11
server:server.cc
	g++ -o $@ $^ -std=c++11

.PHONY:clean
clean:
	rm -f client server

6.2访问控制板的通信: 

下面我们只需要修改一下client端就可以了;让它直接访问控制板;我们约定当client端输入exit就代表退出(此时server端收到命令直接销毁管道和共享内存即可)其他代码不变就不展示了。

运行一下:

更改后的client.cc:

#include"define.hpp"
#include"shm.hpp"
#include"fifo.hpp"

int main(){
    shm sm(pathname,projid,USER);
   oppipe op(".","ff");
   op.openw();
    char*as=(char *)sm.address();
    // for(char ch='a';ch<='z';ch+=2){
    //     sleep(2);
    //     as[ch-'a']=ch;
    //     sleep(1);
    //     as[ch-'a'+1]=ch;
    //     as[ch+2]=0;
    //     op.wakeup_server();
    // }
    while(1){
         string s;
         getline(cin,s);
         if(s=="exit") break;
        char buff[4097]={0};
        int i=0;
        for(auto a:s) buff[i++]=a;
      snprintf(as,sm.sz(),"%s
",buff);
      op.wakeup_server();  
    }
    op.exit_server();
    return 0;
    

}

七.小结:

本次System V 共享内存解说就分享到此;期待我们在下一次Linux篇章再次相遇;感谢阅读。

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

搜索文章

Tags

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