当前位置: 首页 > news >正文

【Linux系统编程】管道

目录

    • 1、什么是管道
    • 2、管道的种类
    • 3、数据的读写
      • 3.1、管道通信
      • 3.2、管道的命令实例:
    • 4、无名管道
      • 4.1、pipe() 无名管道的创建
        • 示例:简单读写
        • 示例:加入进程
        • 示例:通过 管道(pipe) 实现 父子进程之间的双向通信
      • 4.2、popen()建立管道I/O,操作命令
    • 5、命名管道
      • 5.1、为什么要有命名管道
      • 5.2、mkfifo()建立命名管道
      • 5.3、命名管道实现进程间的双向通信
        • 5.3.1、读端
        • 5.3.2、写端
      • 5.4、练习1
      • 5.5、练习2
    • 6、典型的FIFO模型
    • 7、命名管道与无名管道的区别

1、什么是管道

管道是针对于本地计算机的两个进程之间的通信而设计的通信方法,管道建立后,实际获得两个文件描述符:一个用于读取而另外一个用于写入。
管道是半双工的,数据在同一时刻只能向一个方向流动,需要双方通信时,需要建立起两个管道。
管道有个特点:如果读端和写端有一端没打开,另一端就会阻塞
在这里插入图片描述

2、管道的种类

1、匿名管道(无名管道) :(Anonymous Pipe):无名管道只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程,即同一进程组下)。
2、**命名管道(Named Pipe,FIFO):**命名管道单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是单独构成一种文件系统。

3、数据的读写

一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。

3.1、管道通信

是利用FIFO排队模型来指挥进程间的通信。把它当作是连接两个实体的一个单向连接器

3.2、管道的命令实例:

ls -l | wc -l
该命令首先创建两个进程,一个对应于ls –1,另一个对应于wc –l。然后,把第一个进程的标准输出设为第二个进程的标准输入。它的作用是计算当前目录下的文件数量。
在这里插入图片描述

4、无名管道

在这里插入图片描述

无名管道它具有如下特点:

1、只能用于具有亲缘关系的进程之间的通信,即父子进程、兄弟进程

2、半双工的通信模式,具有固定的读端和写端

3、管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read、write函数。

4.1、pipe() 无名管道的创建

头文件

#include <unistd.h>
int pipe(int pipefd[2]);

函数说明:pipe()会建立管道,并将文件描述词由参数pipefd数组返回。pipefd[0]为管道里的读取端,pipefd[1]则为管道的写入端。
在这里插入图片描述

示例:简单读写
#include <stdio.h>
#include <unistd.h>
#include <string.h>int main()
{int fds[2] = {0};if(pipe(fds) < 0){perror("pipe error");return -1;}// fds[0]:读端  fds[1]: 写端printf("fds[0] = %d fds[1] = %d\n",fds[0], fds[1]);//写内容char *str = "hello";write(fds[1],str,strlen(str));//读内容char buf[128] = "";read(fds[0],buf,sizeof(buf) -1);printf("buf = %s\n",buf);close(fds[0]);close(fds[1]);
}
#include <stdio.h>
#include <unistd.h>
#include <string.h>int main()
{int fds[2] = {0};if (pipe(fds) < 0){perror("pipe error");return -1;}// fds[0]:读端  fds[1]: 写端printf("fds[0] = %d fds[1] = %d\n", fds[0], fds[1]);// 写内容char *str = "hello";write(fds[1], str, strlen(str));char *str2 = " world";write(fds[1], str2, strlen(str2));close(fds[1]);// 读内容char buf[6] = "";while (1){int len = read(fds[0], buf, sizeof(buf) - 1);if (len == 0)break;printf("buf = %s\n", buf);memset(buf, 0, sizeof(buf));}close(fds[0]);}
示例:加入进程
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>int main()
{int fds[2] = {0};if(pipe(fds) < 0){perror("pipe error");return -1;}pid_t pid = fork();if (pid < 0){perror("fork error");return -1;}else if(pid == 0){char *str = "hello";int len = write(fds[1],str,strlen(str));printf("child process write len = %d\n",len);}else if(pid > 0){wait(NULL);char buf[128] = "";read(fds[0],buf,sizeof(buf) -1);printf("buf = %s\n",buf);}close(fds[0]);close(fds[1]);}
示例:通过 管道(pipe) 实现 父子进程之间的双向通信
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>int main()
{int fds1[2] = {0};if(pipe(fds1) < 0){perror("pipe error");return -1;}int fds2[2] = {0};if(pipe(fds2) < 0){perror("pipe error");return -1;}pid_t pid = fork();if (pid < 0){perror("fork error");return -1;}else if(pid == 0){char *str = "hello";int len = write(fds1[1],str,strlen(str));printf("child process write len = %d\n",len);char buf[128] = "";read(fds2[0],buf,sizeof(buf) -1);printf("child buf = %s\n",buf);}else if(pid > 0){char buf[128] = "";read(fds1[0],buf,sizeof(buf) -1);printf("buf = %s\n",buf);char *str = " world";int len = write(fds2[1],str,strlen(str));printf("parent write len = %d\n",len);wait(NULL);}close(fds1[0]);close(fds1[1]);close(fds2[0]);close(fds2[1]);}

4.2、popen()建立管道I/O,操作命令

头文件

#include<stdio.h>

函数定义

FILE *popen(const char *command, const char *type);

参数
command:要执行的外部命令,例如 “ls -l” 或 “grep hello”。

type

  • “r”:以只读模式打开管道,读取命令的输出。
  • “w”:以只写模式打开管道,向命令发送输入。

返回值:

  • 成功:返回一个 FILE 指针,可以像操作文件一样操作管道。
  • 失败:返回 NULL,并设置 errno。

注意事项:
在编写具SUID/SGID权限的程序时请尽量避免使用popen(),popen()会继承环境变量,通过环境变量可能会造成系统安全的问题。
popen 执行的命令是通过 shell 解析的,因此需要小心命令注入攻击。

关闭管道
函数定义

int pclose(FILE *stream);

stream:popen 返回的 FILE 指针。

返回值:

  • 成功:返回命令的退出状态。
  • 失败:返回 -1,并设置 errno。

示例

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main()
{FILE *fp = popen("ls -l","r");  //打开ls -l 命令,获取文件指针if(NULL  == fp){perror("popen error");return -1;}char buf[1280] = {0};fread(buf,sizeof(buf) - 1,1,fp);  //读取文件指针指向文件的内容printf("buf = %s\n",buf);pclose(fp);fp = popen("wc","w");   //以写的方式打开wcfwrite(buf,strlen(buf),1,fp);   //把从ls里面读取的内容写到wc里面pclose(fp);system("ls -l | wc");
}

在这里插入图片描述
在这里插入图片描述
管道左边是读取ls -l的内容、右边是写入内容给wc -l统计

5、命名管道

5.1、为什么要有命名管道

无名管道只能用于具有亲缘关系的进程之间,这就限制了无名管道的使用范围

有名管道可以使互不相关的两个进程互相通信。有名管道可以通过路径名来指出,并且在文件系统中可见

进程通过文件IO来操作有名管道

有名管道遵循先进先出规则

不支持如lseek() 操作

5.2、mkfifo()建立命名管道

头文件

#include <sys/types.h>
#include <sys/stat.h>

函数定义

int mkfifo(const char *pathname, mode_t mode);

参数
pathname:命名管道的文件路径,例如 “/tmp/myfifo”。

mode:管道的权限模式,通常使用八进制表示,例如 0666。

返回值:

  • 成功:返回 0。
  • 失败:返回 -1,并设置 errno。

mkfifo()会依参数pathname建立特殊的FIFO文件,该文件必须不存在
参数mode为该文件的权限,因此mode值也会影响到FIFO文件的权限。

当使用open()来打开FIFO文件时O_NONBLOCK旗标会有影响

int open( const char * pathname, int flags);

1、当使用O_NONBLOCK(非阻塞模式) 旗标时,打开FIFO 文件来读取的操作会立刻返回,但是若还没有其他进程打开FIFO 文件来读取,则写入的操作会返回ENXIO 错误代码。必须保证在写时,一定有进程可以接收(读)

2、没有使用O_NONBLOCK 旗标时,打开FIFO 来读取的操作会等待其他进程打开FIFO文件来写入才正常返回。反之亦是如此

3、O_RDONLY或O_WRONLY可与O_NONBLOCK组合使用

  • O_RDONLY 调用open()主进程会处于等待状态,直到其它进程打开相同的FIFO进行写入后才返回
  • O_RDONLY|O_NONBLOCK 调用open()后运行读操作并立即返回主进程
  • O_WRONLY 调用open()主进程会处于等待状态,直到其它进程打开相同的FIFO进行读取后才返回
  • O_WRONLY|O_NONBLOCK 调用open()后运行写操作并立即返回主进程

返回值

  • 若成功则返回0,否则返回-1,错误原因存于errno中。

EACCESS 参数pathname所指定的目录路径无可执行的权限
EEXIST 参数pathname所指定的文件已存在。
ENAMETOOLONG 参数pathname的路径名称太长。
ENOENT 参数pathname包含的目录不存在
ENOSPC文件系统的剩余空间不足
ENOTDIR 参数pathname路径中的目录存在但却非真正的目录。
EROFS参数pathname指定的文件存在于只读文件系统内。

注意:命名管道的使用必须在linux文件夹中使用,不能在winxp映射到linux文件夹中。
管道文件读多少,就清空多少。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>int main()
{//建立管道文件前,检查要创建的文件是否存在char *filename  = "fifo";if(access(filename,F_OK) != 0){if(mkfifo(filename,0666) < 0){perror("mkfifo error");return -1;}}//用open 打开管道文件int fd = open(filename,O_RDWR);if(fd < 0){perror("open error");return -1;}char *str = "hello";write(fd,str,strlen(str));char buf[128] = "";read(fd,buf,sizeof(buf)-1);printf("buf = %s\n",buf);close(fd);unlink(filename);
}

5.3、命名管道实现进程间的双向通信

5.3.1、读端
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>int main()
{//建立管道文件前,检查要创建的文件是否存在char *filename  = "fifo";if(access(filename,F_OK) != 0){if(mkfifo(filename,0666) < 0){perror("mkfifo error");return -1;}}//用open 打开管道文件int fd = open(filename,O_RDWR);if(fd < 0){perror("open error");return -1;}char buf[128] = "";read(fd,buf,sizeof(buf)-1);printf("buf = %s\n",buf);char *str = " world";write(fd,str,strlen(str));printf("write success\n");close(fd);
}
5.3.2、写端
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>int main()
{//建立管道文件前,检查要创建的文件是否存在char *filename  = "fifo";if(access(filename,F_OK) != 0){if(mkfifo(filename,0666) < 0){perror("mkfifo error");return -1;}}//用open 打开管道文件int fd = open(filename,O_RDWR);if(fd < 0){perror("open error");return -1;}char *str = "hello";write(fd,str,strlen(str));printf("write success\n");char buf[128] = "";read(fd,buf,sizeof(buf)-1);printf("read buf = %s\n",buf);close(fd);unlink(filename);
}

5.4、练习1

父子进程,父进程向子进程发送一个整数数组,子进程接收到后计算数组元素之和,再把结果发送给父进程,父进程输出结果

//父子进程,父进程向子进程发送一个整数数组,子进程接收到后计算数组元素之和
//再把结果发送给父进程,父进程输出结果
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>int main()
{int fds1[2] = {0};if(pipe(fds1) < 0){perror("pipe error");return -1;}int fds2[2] = {0};if(pipe(fds2) < 0){perror("pipe error");return -1;}pid_t pid = fork();if (pid < 0){perror("fork error");return -1;}else if(pid == 0){int a[5] = {0};read(fds2[0],a,sizeof(a));int sum = 0;for (int i = 0; i < 5; i++){sum += a[i];}int buf = sum;int len = write(fds1[1],&buf,sizeof(buf));}else if(pid > 0){int a[5] = {1,2,3,4,5};int len = write(fds2[1],a,sizeof(a));int sum = 0;read(fds1[0],&sum,sizeof(sum));printf("sum = %d\n",sum);wait(NULL);}close(fds1[0]);close(fds1[1]);close(fds2[0]);close(fds2[1]);
}

5.5、练习2

用无名管道实现简易版文件复制程序
1.父进程打开一个源文件,将文件内容通过管道发送给子进程
2:子进程接收文件内容后写入另一个文件里

//用无名管道实现简易版文件复制程序
//1.父进程打开一个源文件,将文件内容通过管道发送给子进程
//2:子进程接收文件内容后写入另一个文件里#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include <fcntl.h>int main()
{const char *path = "hello.txt";const char *path2 = "hello2.txt";int fds[2] = {0};if(pipe(fds) < 0){perror("pipe error");return -1;}pid_t pid = fork();if (pid < 0){perror("fork error");return -1;}else if(pid == 0){char buf[9] = "";read(fds[0],buf,sizeof(buf)-1);int fd = open(path2,O_WRONLY | O_CREAT | O_TRUNC,0664);write(fd,buf,strlen(buf));}else if(pid > 0){int fd = open(path,O_RDONLY);char buf[9] = "";read(fd,buf,sizeof(buf)-1);write(fds[1],buf,strlen(buf));wait(NULL);}
}

6、典型的FIFO模型

在这里插入图片描述

7、命名管道与无名管道的区别

PIPE(无名管道)与FIFO(命名管道)的区别:
1.PIPE只能在亲缘进程之间传送数据,FIFO可在不相关的进程间传送数据
2.PIPE管道的消息在进程消失之后随之消失,但是FIFO管道的文件本身是永久的,它存在于真实的磁盘文件中,它并不会因为进程的消失而消失
3.FIFO管道支持同时多个读取端与写入端,多个进程可以写入或读取同一个FIFO文件

相关文章:

【Linux系统编程】管道

目录 1、什么是管道2、管道的种类3、数据的读写3.1、管道通信3.2、管道的命令实例&#xff1a; 4、无名管道4.1、pipe() 无名管道的创建示例&#xff1a;简单读写示例&#xff1a;加入进程示例&#xff1a;通过 管道&#xff08;pipe&#xff09; 实现 父子进程之间的双向通信 …...

LeeCode题库第643题

643.子数组最大平均数I 项目场景&#xff1a; 给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。 请你找出平均数最大且 长度为 k 的连续子数组&#xff0c;并输出该最大平均数。 任何误差小于 10-5 的答案都将被视为正确答案。 示例 1&#xff1a; 输入&#xff…...

数据炼丹与硬件互动:预测湿度的武学之道

前言 在这茫茫数据江湖中&#xff0c;高手过招&#xff0c;唯有融合机器学习与物联网之精髓&#xff0c;方能于风云变幻间自成一派。本文正是为各位江湖同道献上的秘籍&#xff0c;既有数据炼丹&#xff08;预处理、模型训练&#xff09;之奥义&#xff0c;也有硬件互通&#…...

【SpringBoot】MD5加盐算法的详解

目录 一、什么是加盐算法 二、如何实现加盐算法 2.1 加盐算法代码实现 2.2 注册页面中进行密码加盐 2.3 登录页面进行加盐的解密 2.4 注册和登录 一、什么是加盐算法 加盐算法是一种用于增强密码安全性的技术。这种技术通过在密码存储过程中添加一个随机生成的盐值&…...

IP风险度自检,互联网的安全“指南针”

IP地址就像我们的网络“身份证”&#xff0c;而IP风险度则是衡量这个“身份证”安全性的重要指标。它关乎着我们的隐私保护、账号安全以及网络体验&#xff0c;今天就让我们一起深入了解一下IP风险度。 什么是IP风险度 IP风险度是指一个IP地址可能暴露用户真实身份或被网络平台…...

如何手动使用下载并且运行 QwQ-32B-GGUF

首先使用安装 pip install ModelScope 使用 ModelScope 下载对应的模型 modelScope download --model Qwen/QwQ-32B-GGUF qwq-32b-q4_k_m.gguf 第二步开始下载 ollama git clone https://githubfast.com/ggerganov/llama.cpp # githubfast.com 可以加速下载 切换到目录&am…...

【实战ES】实战 Elasticsearch:快速上手与深度实践-附录-3-从ES 7.x到8.x的平滑迁移策略

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 附录-版本升级指南 3-Elasticsearch 7.x 到 8.x 平滑迁移策略指南1. 升级必要性分析1.1 版本特性对比1.2 兼容性评估矩阵 2. 预升级准备清单2.1 环境检查表2.2 数据备份策略 3. 分阶段…...

IP 地址

文章目录 IP 地址IP 地址的分类IPv4 地址IPv6 地址 公有 IP 与私有 IP静态 IP 与动态 IP子网与子网掩码常见 IP 地址用途IP 地址的工作方式总结 IP 地址 IP&#xff08;Internet Protocol&#xff09;地址是计算机网络中的标识符&#xff0c;用于唯一标识网络中的设备。它可以…...

利用余弦相似度在大量文章中找出抄袭的文章

我前面的2篇文章分别讲了如果利用余弦相似度来判断2篇文章的相似度&#xff0c;来确定文章是否存在抄袭&#xff0c;和余弦相似度的原理&#xff0c;即余弦相似度到底是怎么来判断文章的相似性高低的等等。这一篇再说下&#xff0c;对于文章字数多和大量文章时&#xff0c;如果…...

《C语言中“输入魔法师”:scanf函数的奥秘与技巧》

&#x1f680;个人主页&#xff1a;fasdfdaslsfadasdadf &#x1f4d6;收入专栏&#xff1a;C语言 &#x1f30d;文章目入 一、引言二、scanf函数的基本语法三、格式说明符的种类及用法&#xff08;一&#xff09;整数输入&#xff08;二&#xff09;浮点数输入&#xff08;三&…...

VSTO(C#)Excel开发6:与窗体交互

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

PCL 点云OBB包围盒(二)

文章目录 一、简介二、实现步骤二、实现代码三、实现效果参考资料一、简介 包围盒是一种求解离散点集最优包围空间的算法,基本思想是用体积稍大且特性简单的几何体(称为包围盒)来近似地代替复杂的几何对象。(来源于百度)常用的求解包围盒的算法主要有AABB和OOB算法,但AAB…...

IDEA 一键完成:打包 + 推送 + 部署docker镜像

1、本方案要解决场景&#xff1f; 想直接通过本地 IDEA 将最新的代码部署到远程服务器上。 2、本方案适用于什么样的项目&#xff1f; 项目是一个 Spring Boot 的 Java 项目。项目用 maven 进行管理。项目的运行基于 docker 容器&#xff08;即项目将被打成 docker image&am…...

农业建设项目管理系统评测:8款推荐工具优缺点分析

本文主要介绍了以下8款农业建设项目管理系统&#xff1a;1.PingCode&#xff1b; 2. Worktile &#xff1b;3. 建米农业工程项目管理系统&#xff1b;4. 开创云数字农业管理平台&#xff1b; 5. Trimble Ag Software&#xff1b;6.Conservis&#xff1b; 7. Agworld &#xff1…...

【MySQL】表的约束(上)

文章目录 表的约束什么是表的约束空属性默认值列描述&#xff08;comment&#xff09;零填充&#xff08;zerofill&#xff09;主键 总结 表的约束 什么是表的约束 表的约束&#xff08;Constraints&#xff09;是数据库表中的规则&#xff0c;用于限制存储的数据&#xff0c…...

根据TCP中的拥塞控制细说网卡了数据怎么传输

TCP&#xff08;传输控制协议&#xff09;中的拥塞控制是确保网络在数据传输过程中不会发生过载并导致网络崩溃的机制。拥塞控制通过动态地调整发送方的数据传输速率来适应网络的负载&#xff0c;从而避免网络拥塞。TCP的拥塞控制主要是根据网络的状况自动调整其发送速率&#…...

【SpringMVC】入门版

1.基本概念 1.1三层架构 三层架构也就是我们常说的b/s架构中的表现层&#xff0c;业务层和持久层,每层都各司其职&#xff0c;下面来分别讲解这三层的作用。 表现层&#xff1a; 也就是我们常说的web层。它负责接收客户端的请求&#xff0c;向客户端响应结果&#xff0c;通…...

DAY33 贪心算法Ⅱ

122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 想到把整体利润分解为每天的利润&#xff0c;就豁然开朗了。 class Solution { public:int maxProfit(vector<int>& prices) {int result0;for(int i1;i<prices.size();i){resultmax(0,pric…...

re-二维四向迷宫题

关于迷宫 我们结合具体的来进行描述。 迷宫&#xff0c;顾名思义是有墙&#xff0c;且只有一条路可以走下去。当我们在题目中获得了map&#xff08;地图&#xff09;就拥有了上帝视角&#xff0c;就可以顺利的走出迷宫。 在下面这个图就是一个迷宫的map&#xff0c;其中A是起…...

并发编程面试题一

1、什么是进程、线程、协程&#xff0c;他们之间的关系是怎样的 进程是操作系统进行资源分配和调度的基本单位。每个进程都有独立的内存空间&#xff0c;进程之间相互独立&#xff0c;一个进程崩溃不会影响其他进程&#xff0c;进程间通信&#xff08;IPC&#xff09;需要通过…...

3.14周报

本周主要是在找双目视觉三维人体姿态估计方向的文章&#xff0c;这篇dual-diffusion&#xff0c;双目三维人体姿态估计的双扩散文章&#xff0c;引起了兴趣&#xff0c;作者从由于摄像机数量的减少&#xff0c;增加了3d重建的不确定性入手&#xff0c;然后使用了扩散模型&#…...

【redis】zset 类型:基本命令(上)

set 集合&#xff1a; 唯一无序。&#xff08;顺序不重要&#xff09;孙行者、行者孙>同一只猴 list 有序。&#xff08;顺序很重要&#xff09;孙行者、行者孙>不同的猴 zset 有序。升序/降序 有序集合 排序的规则是什么&#xff1f; 给 zset 中的 member 引入了…...

3分钟复现 Manus 超强开源项目 OpenManus

文章目录 前言什么是 OpenManus构建方式环境准备克隆代码仓库安装依赖配置 LLM API运行 OpenManus 效果演示总结个人简介 前言 近期人工智能领域迎来了一位备受瞩目的新星——Manus。Manus 能够独立执行复杂的现实任务&#xff0c;无需人工干预。由于限制原因大部分人无法体验…...

【Java篇】一法不变,万象归一:方法封装与递归的思想之道

文章目录 Java 方法的使用&#xff1a;从基础到递归的全面解析一、方法的概念及使用1.1 什么是方法 (method)?1.2 方法定义1.3 方法调用的执行过程1.4 实参和形参的关系1.5 没有返回值的方法 二、方法重载2.1 为什么需要方法重载2.2 方法重载的概念2.2.4 C 和 Java 的比较&…...

SpringBoot解决跨域

将这个类添加到项目中 ResponseAdvice.java package com.example.homeLearn.config;import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; import org.springframework.http.server.ServerHttpRequest; import org.springframework…...

【实战ES】实战 Elasticsearch:快速上手与深度实践-附录-2-性能调优工具箱

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 附录-性能调优工具箱 2-Elasticsearch 性能调优工具箱深度指南一、性能诊断工具集1.1 实时监控工具1.2 慢查询分析 二、硬件与基础架构优化2.1 存储方案选型2.2 JVM调优参数 三、索引…...

UDP协议栈之整体架构处理

在之前的章节中&#xff0c;笔者就UDP、ICMP、IP、ARP、MAC层的报文格式&#xff0c;以及组帧解帧、CRC校验、分片处理等操作进行了具体介绍以及详细代码实现&#xff0c;并且通过了仿真测试。但之前的仿真测试都是对单层报文的组帧解帧进行的&#xff0c;这些模块仍处于“孤立…...

健康医疗:动态代理 IP 保障医疗数据安全,提升远程医疗服务质量!

在数字化浪潮的推动下&#xff0c;远程医疗服务以其便捷性和高效性受到了广泛的关注。然而&#xff0c;随之而来的是数据安全问题&#xff0c;尤其是医疗数据的安全性&#xff0c;成为了制约远程医疗服务发展的关键因素。幸运的是&#xff0c;动态代理IP技术的出现&#xff0c;…...

Navicat SqlServer 设置自增主键

Navicat是一款优秀的数据库管理工具&#xff0c;可以连接很多类型的数据库。使用它可以极大的提高工作效率。 Navicat 不能设置SqlServer自增字段&#xff0c;只能通过sql语句来实现 建表时设置 create table <表名> ( <字段1-主键> int identity (1,1) primar…...

实验8 搜索技术

实验8 搜索技术 一、实验目的 &#xff08;1&#xff09;掌握搜索技术的相关理论&#xff0c;能根据实际情况选取合适的搜索方法&#xff1b; &#xff08;2&#xff09;进一步熟悉盲目搜索技术&#xff0c;掌握其在搜索过程中的优缺点&#xff1b; &#xff08;3&#xff09;…...

IMA+DeepSeekR1+本地知识库撰写NOIP2008普及组T3【传球游戏】题解

目录 一、提问词 二、DeepSeekR1回复 题目描述 解题思路 实现代码 代码说明 三、说明 【IMADeepSeekR1本地知识库】撰写NOIP2008普及组复赛题解系列 1、IMADeepSeekR1本地知识库撰写NOIP2008普及组T1【ISBN 号码】题解-CSDN博客 2、IMADeepSeekR1本地知识库撰写NOIP200…...

查找特定的值(信息学奥赛一本通-1110)

【题目描述】 在一个序列(下标从1开始)中查找一个给定的值&#xff0c;输出第一次出现的位置。 【输入】 第一行包含一个正整数n&#xff0c;表示序列中元素个数。1 <n< 10000。 第二行包含n个整数&#xff0c;依次给出序列的每个元素&#xff0c;相邻两个整数之间用单个…...

Qt项目中集成第三方模块的.pri文件

对于功能模块较多的Qt项目&#xff0c;使用pri文件管理模块文件&#xff0c;降低工程复杂度&#xff0c;提高软件模块的封装性和重用性。 一、.pro与.pri 对于模块化编程&#xff0c;Qt提供了pro和pri&#xff0c;pro管理项目&#xff0c;pri管理模块。 .pro 文件是Qt项目的…...

200多种算法应用于二维和三维无线传感器网络(WSN)覆盖场景

2.1 二元感知模型 在当前无线传感器网络&#xff08;WSN&#xff09;覆盖场景中&#xff0c;最常见且理想的感知模型是二元感知模型[27]。如图2所示&#xff0c; Q 1 Q_1 Q1​和 Q 2 Q_2 Q2​代表平面区域内的两个随机点。 Q 1 Q_1 Q1​位于传感器的检测区域内&#xff0c;其感…...

【QT】文件系统相关 -- QFile

一、Qt 文件概述 &#x1f525; 文件操作是应用程序必不可少的部分。Qt 作为⼀个通用开发库&#xff0c;提供了跨平台的文件操作能力。Qt 提供了很多关于⽂件的类&#xff0c;通过这些类能够对文件系统进行操作&#xff0c;如文件读写、文件信息获取、文件制或重命名等 二、输…...

transformer bert 多头自注意力

输入的&#xff08;a1,a2,a3,a4&#xff09;是最终嵌入&#xff0c;是一个(512,768)的矩阵&#xff1b;而a1是一个token&#xff0c;尺寸是768 a1通过Wq权重矩阵&#xff0c;经过全连接变换得到查询向量q1&#xff1b;a2通过Wk权重矩阵得到键向量k2&#xff1b;q和k点乘就是值…...

人工智能之数学基础:线性变换的象空间和零空间

本文重点 前面的课程中,我们学习了线性变换,由此而引申出线性变换的象空间和零空间,这两个空间在机器学习领域会被经常用到,本文对此进行学习。 直观理解 总的来说象空间就是经过线性变换得到的空间,零空间就是经过线性变换是零的元素构成的空间。 从几何角度来看,象空…...

数据的存储---整型、浮点型

目录 一、整型在内存中的存储 1. 原码、反码、补码 2. 大端与小端 二、浮点数在内存中的存储 1.浮点数的存 2. 浮点数的取 3. 题目解析 一个变量的创建需要在内存中开辟空间&#xff0c;而开辟的空间大小是由数据类型决定的。下面我们就来讨论一下整型、浮点型在内存中的…...

鲸鱼算法WOA对风电场风电机组一次二次调频参数进行全局最优辨识,二次调频参数辩识matlab/simulink,也可进一步修改成一次调频参数辩识

模型为二次调频模型&#xff0c;也可修改为一次调频模型参数辩识 随着风电在电力系统中占比提高,其调频特性对电力系统频率稳定性的影响增大&#xff0c;例如&#xff0c;随着风电渗透水平不断提升&#xff0c;系统惯量不断增加&#xff0c;电力系统频率不断下降&#xff0c;在…...

Spring 中 SmartInitializingSingleton 的作用和示例

一、 接口定义 SmartInitializingSingleton 是 Spring 框架提供的一个 单例 Bean 全局初始化回调接口&#xff0c;用于在 所有非延迟单例 Bean 初始化完成后 执行自定义逻辑。 核心方法&#xff1a; public interface SmartInitializingSingleton {void afterSingletonsInsta…...

《TCP/IP网络编程》学习笔记 | Chapter 18:多线程服务器端的实现

《TCP/IP网络编程》学习笔记 | Chapter 18&#xff1a;多线程服务器端的实现 《TCP/IP网络编程》学习笔记 | Chapter 18&#xff1a;多线程服务器端的实现线程的概念引入线程的背景线程与进程的区别 线程创建与运行pthread_createpthread_join可在临界区内调用的函数工作&#…...

Unity AI 技术浅析(三):智能代理(Agents)

Unity AI的智能代理(Agents)技术是实现游戏和虚拟现实应用中非玩家角色(NPC)、敌人、盟友等智能行为的核心。通过智能代理,开发者可以为虚拟角色赋予感知、决策和行动的能力,使其能够与环境和其他角色进行复杂的交互。 一、智能代理的基本原理 智能代理是能够在特定环境…...

加油站~~

求最少加油次数就是一个贪心问题&#xff0c;这里也不需要证明&#xff0c;根据我们的常识也知道就是走到油不够的时候就加油就好了&#xff0c;这里的no solution这有在两个加油站之间的距离大于了加满油后的行驶距离才会存在&#xff0c;其他情况都是可以计算的。代码有很多细…...

【商城实战(24)】商城性能大揭秘:压力测试与性能监控实战

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…...

Linly-Talker:开源数字人框架的技术解析与影响

一、引言&#xff1a;AI 数字人的发展趋势 近年来&#xff0c;数字人&#xff08;Digital Human&#xff09; 技术迅速发展&#xff0c;从最早的 2D 虚拟主播&#xff0c;到如今能够进行实时交互的 3D 智能助手&#xff0c;AI 在多模态交互领域的应用愈发广泛。各大互联网公司…...

【Nexus】Maven 私服搭建以及上传自己的Jar包

Nexus 安装 docker run -d -uroot --name nexus3 --restartalways -p 8081:8081 -v /data/nexus-data/blobs:/nexus-data/blobs -v /etc/localtime:/etc/localtime sonatype/nexus3这里也提供一下docker-composer的方法 .env 文件 VERSIONlatest CONTAINER_NAMECONTAINER_N…...

wlwrap 与 rlwrap 的区别对比:图形显示协议的演变

在 Linux 系统中&#xff0c;许多工具和程序依赖于命令行界面&#xff08;CLI&#xff09;来进行交互&#xff0c;尤其是对于那些没有图形用户界面的应用程序。在这种情况下&#xff0c;命令行编辑、历史记录和自动补全等功能是提升工作效率和用户体验的关键。rlwrap 和 wlwrap…...

矩阵交换行(信息学奥赛一本通-1119)

【题目描述】 给定一个55的矩阵(数学上&#xff0c;一个rc的矩阵是一个由r行c列元素排列成的矩形阵列)&#xff0c;将第n行和第m行交换&#xff0c;输出交换后的结果。 【输入】 输入共6行&#xff0c;前5行为矩阵的每一行元素,元素与元素之间以一个空格分开。 第6行包含两个整…...

CP210x 驱动秘籍:打通 Windows 11 端口的任督二脉

前言 江湖上&#xff0c;众多电脑侠客在安装 Windows 11 时&#xff0c;遭遇“端口失踪案”。原来&#xff0c;这是缺少 CP210x 驱动的“内功心法”。今日&#xff0c;贫道便传授一套独门秘籍&#xff0c;助你打通端口“任督二脉”&#xff0c;让数据流畅如江湖中轻功高手。 …...

IDEA集成git,项目的克隆,远程仓库中文件的添加删除

目录 一、克隆项目 二、使用IDEA完成文件的上传和删除 1.配置git 2.上传 3.删除&#xff08;通过git bash&#xff09; 一、克隆项目 点击克隆&#xff0c;复制url &#xff0c;如下 打开你想要克隆到哪里&#xff0c;右击&#xff0c;选择 open Git Bash here 这一步之后…...