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

【Linux网络编程】之守护进程

【Linux网络编程】之守护进程

  • 进程组
    • 进程组的概念
    • 组长进程
  • 会话
    • 会话的概念
    • 会话ID
  • 控制终端
    • 控制终端的概念
    • 控制终端的作用
    • 会话、终端、bash三者的关系
  • 前台进程与后台进程
    • 概念
    • 特点
    • 查看当前终端的后台进程
    • 前台进程与后台进程的切换
  • 作业控制
    • 相关概念
    • 作业状态(一般指后台作业)
  • 守护进程
    • 概念
    • 将进程守护化
      • 进程守护化的步骤
      • 代码实现

进程组

进程组的概念

当我们使用以下命令查与进程相关的属性时,会看到一个叫PGID的属性:

ps ajx

image-20250207143545861

它标识某一个进程属于哪个进程组。

进程组是一个进程或者多个进程的集合。每一个进程组有唯一的PGID,它是一个正整数,和PPIDPID一样,可以在C语言中用pid_t类型表示。

例如,在终端中执行如下命令:

sleep 1000 | sleep 2000 | sleep 3000

使用ps查看:

ps ajx | head -1 && ps ajx | grep -v 'grep' | grep sleep

img

这三个进程的PPID也就是父进程都是一样的,也就是-bash进程,所以这三个sleep进程是兄弟进程,它们同属于一个进程组。

image-20250207144949286

就算只有一个进程,它也会自成一个进程组:

image-20250207145100828

组长进程

组长进程就是进程组中的第一个创建的进程(按照时间),如果这个进程组中就只有一个进程,那么它就是进程组中的组长。

当进程组中的组长终止后,这个进程组并不会终止,要等到这个进程组中的最后一个进程终止,它才会终止。

代码验证1:使用下面代码先验证,C语言fork子进程,父进程和子进程属于一个进程组,且父进程是组长进程。

#include<stdio.h>
#include<unistd.h>
int main()
{pid_t id = fork();if(id == 0)//子进程执行{while(1){printf("i am child,my pid is %d\n",getpid());sleep(1);}}while(1);return 0;
}

运行结果:

image-20250207150717602

代码验证2:当组长进程结束,进程组并不会立即终止,而是等这个组中所有的进程终止后再终止:

#include<stdio.h>
#include<unistd.h>
int main()
{pid_t id = fork();if(id == 0)//子进程执行{while(1){printf("i am child,my pid is %d\n",getpid());sleep(1);}}return 0;
}

运行结果:

image-20250207151249008

会话

会话的概念

会话可以看作是多个进程组的集合,一个会话会有多个进程组,会话也会有唯一的会话ID。

一般来说,会话中的第一个进程组是-bash对应的进程组,会话ID等于该-bash进程组的组ID。

image-20250207153415886

通常来说,进程组可以由以下方式创建:

  1. 通过管道创建兄弟进程,这些兄弟进程是一个进程组
  2. 父进程fork子进程,父子进程是一个进程组。

会话ID

上面我们提到了会话ID,会话ID就是该会话中首进程的进程ID或者说是首进程的组ID。(就是-bash进程的进程ID,-bash进程总是会首进程,也是会首进程的组长进程)。

控制终端

控制终端的概念

在Linux/类Uinx系统中,控制终端通常与会话关联。即一个会话对应一个控制终端

当用户通过一个终端登录系统,会得到一个首进程shell进程,这个终端成为shell进程的控制终端,由于有关控制终端的信息存储在进程PCB中,后续的其它进程都是通过shell进程fork的,所以其它进程的控制终端也都是这个控制终端。

实际上控制终端是一个逻辑概念,每个控制终端都对应一个终端文件。这些文件被称为终端文件tty设备文件

Linux中,终端文件在/dev/pts路径下:

ls /dev/pts

实验验证:实验步骤如下。

  1. 终端1,循环执行以下脚本指令:

     while :;do ls -l /dev/pts;sleep 1;echo "~~~~~~~~~~~~~~~~~";done
    
  2. 不断创建新的终端,观察打印的终端文件是否增多。

  3. 关闭打开的终端,观察打印的终端文件是否减少。

实验现象如下:

屏幕录制-2025-02-07-172050

控制终端的作用

  1. 信号发送:可以通过特定的组合键向前台进程组发送信号,比如Ctrl+C发送SIGINT信号来中断当前操作,或者Ctrl+Z发送SIGTSTP暂停一个进程。

  2. 输入输出:控制终端为进程提供标准输入、输出和错误流。大多数情况下,这些流直接对应于用户的键盘输入和屏幕显示。

    • 什么意思呢,就是我们向键盘输入一个内容都会显示在控制终端上,printf等往显示器打印的函数,打印的内容也会显示到终端上。因为**当进程启动时,如果没有特别指定其他的输入输出目的地(重定向),其标准输入、输出和错误流默认就会关联到控制终端对应的设备文件上。**云服务器上文件描述符012指向的文件:

      image-20250207173240326

    • 虚拟机中(也类似):

      image-20250207174036657

  3. 作业控制:允许用户管理属于当前shell会话的不同任务(作业)。这包括将作业放到后台执行或从前台恢复执行。作业和前台后台进程的概念我们稍后会谈。

会话、终端、bash三者的关系

Linux中的shell进程叫做bash,当用户通过xshell等ssh远程登录客户端中的终端登录后,这个终端成为bash进程的控制终端,而这个终端中的所有进程组(前台和后台)构成一个会话(当你登录系统并启动bash时,实际上就开启了一个新的会话。),画图来表示就是下面这样:

image-20250207181459757

前台进程与后台进程

概念

前台进程和后台进程都是进程,唯一区别就是前台进程可以通过终端接收用户的输入,同时也可以接收来自用户的命令(ctrl Cctrl Z),前台进程还可以将输出输入到显示器(也就是终端上)。但是后台进程则不同,它不直接与用户交互,即它们不接受键盘输入,也不将输出直接显示给用户(除非特别配置)。

特点

  1. 前台进程
    • 独占性:同一终端,同一时刻,只能有一个进程或进程组。这意味着前台进程对输入输出有独占性。
    • 用户交互:前台进程可以直接通过终端与用户进行交互。这意味着它可以接受用户的输入,并将其显示在屏幕上。通常用户输入的命令,就是在前台运行。
    • 信号响应:前台进程组可以接收到某些类型的信号,比如通过按下Ctrl+C发送的SIGINT中断信号来终止当前操作。这是前台进程的一个重要特性,允许用户直接控制正在运行的程序。
  2. 后台进程
    • 并发执行:多个后台进程可以同时执行(并发是看似同时执行,实则轮询执行),一个终端可以有多个后台作业同时执行。
    • 无需与用户交互:不接收用户的输入,也不会将输出直接显示给用户。
    • 信号限制ctrl C等命令无法作用于后台进程,要使用killkillall等命令。

查看当前终端的后台进程

命令jobs可以查看当前终端的后台进程,它会显示每个后台作业的作业号和状态。

jobs

选项-l:添加 -l 选项后,jobs 命令不仅显示基本的作业信息,还会额外列出每个作业的进程ID(PID)。

前台进程与后台进程的切换

  1. 前台进程切换为后台进程

    • 方法1:在执行一个程序时,在后面加上&

      image-20250207183742115

    • 方法2ctrl Z暂停某个正在执行的前台进程,它将被切为后台进程:

      image-20250207184541663

    • 方法3:当某个子进程的父进程结束,它还在运行时它就会变成孤儿进程。无法通过ctrl C命令终止它的运行,因为孤儿进程被initSIDPID为1)进程收养,但可以通过killkillall命令终止它。可以认为这是一种特殊情况。

  2. 后台进程切换为前台进程

    • 使用命令fg(foreground的缩写)将后台进程切换为前台进程:

      fg 作业号
      

      image-20250207193051184

    • 扩展命令bg,这个命令可以将暂停的命令继续在后台运行。

      bg
      

    `
    image-20250207193909521

作业控制

相关概念

作业

作业是指Linux系统中正在运行的一个进程或者进程组(多个进程)。进程之间一般通过管道来互相协作。

作业控制

shell可以同时运行一个前台作业和多个后台作业,这叫做作业控制。前台作业和后台作业都可以由多个进程组成。

作业号

作业号是后台作业专有的,它们在开始执行时或者执行完后会返回一个作业号。

示例1

echo "1111" &

image-20250208174913663

示例2

sleep 1000 | sleep 2000 | sleep 3000 &

image-20250208175050370

  • [1]就是该作业的作业号。

作业状态(一般指后台作业)

常见的作业有以下状态:

作业状态含义
正在运行(Running)后台作业(&),正在运行
暂停运行(Stopped)前台作业被ctrl z(或者是后台作业被相应的信号所暂停)暂停了
完成(Done)后台作业已完成执行(返回的状态码为0)
完成(Done(code))后台作业完成执行(返回的状态码非0)
终止(Terminated)后台作业被终止
  1. Running状态:

    image-20250208180841505

  2. Stopped状态:

    image-20250208181403878

  3. Done状态:

    image-20250208181451788

  4. Terminated状态:

    image-20250208181651879

  5. Done(code)状态。后台执行下面的脚本文件:

    exit 42 # 返回退出状态码42
    

    image-20250208182301269

守护进程

概念

守护进程不同于普通的后台进程(作业),普通的后台作业它有关联的终端,即使不与用户交互或者不输出内容到用户的显示器上,但是守护进程有自己独立的会话,并且它无终端关联,脱离终端控制,除非系统关闭,否则守护进程不会轻易的关闭。

常见的守护进程:比如httpd(Apache HTTP服务器)、sshd(SSH服务器)、crond(定时任务调度器)等都是典型的守护进程,它们为系统提供核心服务。

普通后台程序:例如,你在终端中运行的一个长时间的数据处理脚本,并在其后加上&让它在后台运行。这个脚本就是一个普通的后台程序,而不是守护进程。

将进程守护化

进程守护化的步骤

  1. 父进程fork子进程:让父进程退出,后续都是子进程来执行相关程序,并成为守护进程,因为创建一个新的会话需要该进程不是进程组的组长。这是系统设计所决定的,如果不这样做,会有循环依赖问题。
  2. setsid() 创建新会话:使子进程成为新会话的领导者,并脱离所有终端的控制,确保它没有控制终端。
  3. 改变当前工作目录(如果需要):通常是切换到根目录(/),以避免占用挂载点。
  4. 重定向标准输入、输出和错误流(如果后面不使用也可以关闭):通常指向/dev/null或其他适当的日志文件,以防止无意中使用这些默认流。/dev/null文件读取都会读到null,写入都会被自动丢弃。
  5. 关闭不需要的文件描述符:确保除了必要的资源外,其他文件描述符都被关闭。

代码实现

#include<stdio.h>
#include<unistd.h>
#include<stdbool.h>
#include <fcntl.h>
#include <stdlib.h>
#include <signal.h>const char* newdir = "/";
const char* newpath = "/dev/null";
void Demon(bool IsChangeWorkDir,bool IsRedir)
{//0.忽略可能引起程序异常的信号// 忽略SIGCHLD信号,防止产生僵尸进程signal(SIGCHLD, SIG_IGN);// 忽略SIGPIPE信号,避免程序因写入已关闭的pipe/socket而终止signal(SIGPIPE, SIG_IGN);//1.创建子进程,并让父进程退出if(fork() > 0){printf("pid is %d\n",getpid());exit(0);}//2.让子进程新建一个会话,成为守护进程,子进程成为新会话的leader进程,会话ID和这个子进程的进程ID相同setsid();//3. 已经成为守护进程,查看是否需要更改工作目录if(IsChangeWorkDir){chdir(newdir);}//4.查看是否需要重定向0、1、2标准输入、输入、错误流if(IsRedir){int fd = open(newpath,O_RDWR);//以读写模式打开dup2(fd,0);dup2(fd,1);dup2(fd,2);close(fd);//不需要fd了}else{close(0);close(1);close(2);}
}
int main()
{Demon(true,true);while(true);//变成守护进程了return 0;
}

运行结果:

image-20250208193403430

相关文章:

【Linux网络编程】之守护进程

【Linux网络编程】之守护进程 进程组进程组的概念组长进程 会话会话的概念会话ID 控制终端控制终端的概念控制终端的作用会话、终端、bash三者的关系 前台进程与后台进程概念特点查看当前终端的后台进程前台进程与后台进程的切换 作业控制相关概念作业状态&#xff08;一般指后…...

Vue.js如何根据访问路径切换页面

Vue Router 在前端工程中&#xff0c;路由指的是&#xff0c;根据不同的访问路径&#xff0c;展示不同组件的内容。 Vue Router是Vue.js的官方路由。 Vue Router介绍。 要使用vue Router&#xff0c;得先安装 npm install vue-router4这里的4&#xff0c;指的是第4个版本 在s…...

Vue与Konva:解锁Canvas绘图的无限可能

前言 在现代Web开发中&#xff0c;动态、交互式的图形界面已成为提升用户体验的关键要素。Vue.js&#xff0c;作为一款轻量级且高效的前端框架&#xff0c;凭借其响应式数据绑定和组件化开发模式&#xff0c;赢得了众多开发者的青睐。而当Vue.js邂逅Konva.js&#xff0c;两者结…...

collabora online+nextcloud+mariadb在线文档协助

1、环境 龙蜥os 8.9 docker 2、安装docker dnf -y install dnf-plugins-core dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sed -i shttps://download.docker.comhttps://mirrors.tuna.tsinghua.edu.cn/docker-ce /etc/yum.repos.…...

linux基础命令1

1、linux目录结构——树型结构 根目录&#xff1a;/ 用户主目录(家目录)&#xff1a;~或者 /home/edu 根目录下常见的文件夹: 2、常见的命令 1、pwd 查看当前目录 cd 切换目录 cd ~ 切换到家目录 2、ls 查看当前目录的文件信息 语法:ls [选项] [参…...

[LVGL] 在VC_MFC中移植LVGL

前言&#xff1a; 0. 在MFC中开发LVGL的优点是可以用多个Window界面做辅助扩展【类似GUIguider】 1.本文基于VC2022-MFC单文档框架移植lvgl8 2. gitee上下载lvgl8.3 源码&#xff0c;并将其文件夹改名为lvgl lvgl: LVGL 是一个开源图形库&#xff0c;提供您创建具有易于使用…...

Spring Boot整合MQTT

MQTT是基于代理的轻量级的消息发布订阅传输协议。 1、下载安装代理 进入mosquitto下载地址&#xff1a;Download | Eclipse Mosquitto&#xff0c;进行下载&#xff0c;以win版本为例 下载完成后&#xff0c;在本地文件夹找到下载的代理安装文件 使用管理员身份打开安装 安装…...

elasticsearch实战三 elasticsearch与mysql数据实时同步

一 介绍 elasticsearch数据不是一直不变的&#xff0c;需要与mysql、oracle等数据库的数据做同步。 本博客里涉及到的项目地址&#xff1a;https://www.aliyundrive.com/s/7bRWpTYsxWV 方案一&#xff1a; 同步调用&#xff0c;即操作mysql数据后&#xff0c;接着操作elastic…...

netcore openTelemetry+prometheus+grafana

一、netcore项目 二、openTelemetry 三、prometheus 四、grafana添加Dashborad aspire/src/Grafana/dashboards at main dotnet/aspire GitHub 导入&#xff1a;aspnetcore.json和aspnetcore-endpoint.json 效果&#xff1a;...

StochSync:可在任意空间中生成360°全景图和3D网格纹理

StochSync方法可以用于在任意空间中生成图像&#xff0c;尤其是360全景图和3D网格纹理。该方法利用了预训练的图像扩散模型&#xff0c;以实现零-shot生成&#xff0c;消除了对新数据收集和单独训练生成模型的需求。StochSync 结合了 Diffusion Synchronization&#xff08;DS&…...

MybatisPlus较全常用复杂查询引例(limit、orderby、groupby、having、like...)

MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。以下是 MyBatis-Plus 中常用复杂查询&#xff08;如 LIMIT、ORDER BY、GROUP BY、HAVING、LIKE 等&#xff09;的引例&#xff1a; 1. 环境准备…...

大数据项目2:基于hadoop的电影推荐和分析系统设计和实现

前言 大数据项目源码资料说明&#xff1a; 大数据项目资料来自我多年工作中的开发积累与沉淀。 我分享的每个项目都有完整代码、数据、文档、效果图、部署文档及讲解视频。 可用于毕设、课设、学习、工作或者二次开发等&#xff0c;极大提升效率&#xff01; 1、项目目标 本…...

win10的Unet项目导入阿里云训练

win10配置文件 annotated-types0.7.0 certifi2024.12.14 charset-normalizer3.4.1 click8.1.8 colorama0.4.6 contourpy1.1.1 cycler0.12.1 docker-pycreds0.4.0 eval_type_backport0.2.2 filelock3.16.1 fonttools4.55.3 fsspec2024.12.0 gitdb4.0.12 GitPython3.1.44 idna3.…...

Linux(20)——调度作业

目录 一、调度延迟的用户作业&#xff1a; 1、延迟的用户作业&#xff1a; 2、查看延迟的用户作业&#xff1a; 3、从计划中删除作业&#xff1a; 二、调度周期性用户作业&#xff1a; 1、周期性用户作业&#xff1a; 2、调度周期性用户作业&#xff1a; 3、用户作业格…...

DeepSeek赋能Vue:打造超丝滑进度条开发指南

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。

题目&#xff1a;在CT107D单片机综合训练平台上&#xff0c;8个数码管分别单独依次显示0~9的值&#xff0c;然后所有数码管一起同时显示0~F的值&#xff0c;如此往复。 延时函数分析LED首先实现8个数码管单独依次显示0~9的数字所有数码管一起同时显示0~F的值&#xff0c;如此往…...

清除el-table选中状态 clearSelection

如何在Vue应用中使用Element UI的el-table组件&#xff0c;通过this.$refs.multipleTable.clearSelection()方法来清除所有选中行的状态。适合前端开发者了解表格组件的交互操作。 // el-table绑定ref<el-table selection-change"selsChange" ref"multipl…...

【算法】动态规划专题⑥ —— 完全背包问题 python

目录 前置知识进入正题模板 前置知识 【算法】动态规划专题⑤ —— 0-1背包问题 滚动数组优化 完全背包问题是动态规划中的一种经典问题&#xff0c;它与0-1背包问题相似&#xff0c;但有一个关键的区别&#xff1a;在完全背包问题中&#xff0c;每种物品都有无限的数量可用。…...

论文笔记-COLING2025-LLMTreeRec

论文笔记-COLING2025-LLMTreeRec: Unleashing the Power of Large Language Models for Cold-Start Recommendations LLMTreeRec: 释放大语言模型在冷启动推荐中的力量摘要1.引言2.框架2.1项目树构建2.2以LLM为中心的基于树的推荐2.2.1推荐链策略2.2.2检索策略 3.实验3.1实验设…...

c++ haru生成pdf输出饼图

#define PI 3.14159265358979323846 // 绘制饼图的函数 void draw_pie_chart(HPDF_Doc pdf, HPDF_Page page, float *data, int data_count, float x, float y, float radius) { float total 0; int i; // 计算数据总和 for (i 0; i < data_count; i) { tot…...

【‌Unity】Unity中物体的static属性作用

‌Unity中物体的static属性主要用于优化游戏性能和简化渲染过程。‌ Unity中物体的static属性的作用 优化渲染性能‌&#xff1a;当物体被标记为static时&#xff0c;Unity会在游戏运行时将其视为静止的物体&#xff0c;这意味着这些物体的渲染信息不会随着每一帧的更新而变化…...

Rust 测试指南:从入门到进阶

1. 测试基础&#xff1a;#[test] 属性 Rust 测试的基本单位是函数。只要在一个函数前面标注 #[test] 属性&#xff0c;那么在运行 cargo test 时&#xff0c;Rust 会自动识别并执行它。例如&#xff0c;新建一个库工程 adder&#xff0c;cargo new adder --lib&#xff0c;在 …...

Elasticsearch 生产集群部署终极方案

Elasticsearch 集群部署 1.集群部署1.1 新增用户1.2 优化操作系统1.3 JDK1.4 elasticsearch1.5 开机自启动 2.安全认证功能2.1 生成CA证书2.2 生成密钥2.3 上传至其他节点2.4 修改属主、属组2.5 配置文件添加参数2.6 各节点添加密钥库密码2.7 设置用户密码 1.集群部署 1.1 新增…...

电路笔记(元器件):AD 5263数字电位计(暂记)

AD5263 是四通道、15 V、256位数字电位计&#xff0c;可通过SPI/I2C配置具体电平值。 配置模式&#xff1a; W引脚作为电位器的抽头&#xff0c;可在A-B之间调整任意位置的电阻值。也可将W与A(或B)引脚短接&#xff0c;A-W间的电阻总是0欧姆&#xff0c;通过数字接口调整电位器…...

如何在电脑后台定时进行自动截图?自动截图后如何快捷保存?如何远程查看?

7-2 有时候需要对电脑的屏幕进行在后台连续性的截图保存&#xff0c;并且要可以远程查看&#xff0c;无界面&#xff0c;以达到对电脑的使用过程进行完全了解的目的&#xff0c;一般用于对小孩使用电脑的掌握&#xff0c;如果父母在外地&#xff0c;不方便就近管理&#xff0c…...

解决react中函数式组件usestate异步更新

问题&#xff1a;在点击modal组件确认后 调用后端接口&#xff0c;使用setstateone&#xff08;false&#xff09;使modal组件关闭&#xff0c;但是设置后关闭不了&#xff0c;在设置setstateone&#xff08;false&#xff09;前后打印出了对应的stateone都为true&#xff0c;但…...

skia-macos源码编译

1、下载git-hub 源码 2、下载依赖库 3、编译&#xff0c;注意选项 bin/gn gen out/release --args"is_official_buildfalse skia_use_system_expatfalse skia_use_system_icufalse skia_use_libjpeg_turbofalse skia_use_system_libpngfalse skia_use_system_libwebpfal…...

本地部署DeepSeek(Mac版本,带图形化操作界面)

一、下载安装&#xff1a;Ollama 官网下载&#xff1a;Download Ollama on macOS 二、安装Ollama 1、直接解压zip压缩包&#xff0c;解压出来就是应用程序 2、直接将Ollama拖到应用程序中即可 3、启动终端命令验证 # 输入 ollama 代表已经安装成功。 4、下载模型 点击模型…...

离线统信系统的python第三方库批量安装流程

一、关于UOS本机 操作系统&#xff1a;UOS&#xff08;基于Debian的Linux发行版&#xff09; CPU&#xff1a;海光x86 二、具体步骤 1、在联网的电脑上用控制台的pip命令批量下载指定版本的第三方库 方法A cd <目标位置的绝对路径> pip download -d . --platform many…...

群晖安装Gitea

安装Docker Docker运行Gitea 上传gitea包&#xff0c;下载地址&#xff1a;https://download.csdn.net/download/hmxm6/90360455 打开docker 点击印象&#xff0c;点击新增&#xff0c;从文件添加 点击启动 可根据情况&#xff0c;进行高级设置&#xff0c;没有就下一步 点击应…...

jmeter逻辑控制器9

1&#xff0c;简单控制器2&#xff0c;录制控制器3&#xff0c;循环控制器4&#xff0c;随机控制器5&#xff0c;随机顺序控制器6&#xff0c;if控制器7&#xff0c;模块控制器8&#xff0c;Include控制器9&#xff0c;事物控制器本文永久更新地址: 1&#xff0c;简单控制器 不…...

Spring统一修改RequestBody

我们编写RestController时&#xff0c;有可能多个接口使用了相同的RequestBody&#xff0c;在一些场景下需求修改传入的RequestBody的值&#xff0c;如果是每个controller中都去修改&#xff0c;代码会比较繁琐&#xff0c;最好的方式是在一个地方统一修改&#xff0c;比如将he…...

自动化xpath定位元素(附几款浏览器xpath插件)

在 Web 自动化测试、数据采集、前端调试中&#xff0c;XPath 仍然是不可或缺的技能。虽然 CSS 选择器越来越强大&#xff0c;但面对复杂 DOM 结构时&#xff0c;XPath 仍然更具灵活性。因此&#xff0c;掌握 XPath&#xff0c;不仅能提高自动化测试的稳定性&#xff0c;还能在爬…...

go-elasticsearch创建ik索引并进行查询操作

es-go client引入gomod go get github.com/elastic/go-elasticsearch/v8latest连接es服务器&#xff08;不经过安全校验) cfg : elasticsearch.Config{Addresses: []string{"http://localhost:9200",}, } es, err : elasticsearch.NewClient(cfg) if err ! nil {pa…...

【东莞常平】戴尔R710服务器不开机维修分享

1&#xff1a;2025-02-06一位老客户的朋友刚开工公司ERP服务器一台戴尔老服务器故障无法开机&#xff0c;于是经老客户介绍找到我们。 2&#xff1a;服务器型号是DELL PowerEdge R710 这个服务器至少也有15年以上的使用年限了。 3&#xff1a;客户反馈的故障问题为&#xff1a;…...

rebase和merge

rebase 和merge区别&#xff1a; rebase变基&#xff0c;改变基底&#xff1a;rebase会抹去提交记录。 git pull 默认merge&#xff0c;git pull --rebase 变基 rebase C、D提交属于feature分支&#xff0c;是基于master分支&#xff0c;在B提交额外拉出来的&#xff0c;当…...

SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现

SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现 目录 SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来&#xff08;优…...

2025牛客寒假算法基础集训营5(补题)

C 小L的位运算 显然&#xff0c;如果两次反置的价格小于等于交换的价格&#xff0c;那么直接全部反置就好了。 反之&#xff0c;由于交换一定低于两次反置&#xff0c;我们尽可能用交换来消去不正确的位置。不正确的位置类型只有00&#xff0c;01&#xff0c;10&#xff0c;11&…...

Kotlin Android 环境搭建

Kotlin Android 环境搭建 引言 随着移动应用的日益普及,Android 开发成为了一个热门的技术领域。Kotlin 作为一种现代的编程语言,因其简洁、安全、互操作性强等特点,被越来越多的开发者所喜爱。本文将详细介绍 Kotlin Android 环境搭建的步骤,帮助您快速上手 Kotlin Andr…...

DeepSeek图解10页PDF

以前一直在关注国内外的一些AI工具&#xff0c;包括文本型、图像类的一些AI实践&#xff0c;最近DeepSeek突然爆火&#xff0c;从互联网收集一些资料与大家一起分享学习。 本章节分享的文件为网上流传的DeepSeek图解10页PDF&#xff0c;免费附件链接给出。 1 本地 1 本地部…...

Kafka中的KRaft算法

我们之前的Kafka值依赖于Zookeeper注册中心来启动的&#xff0c;往里面注册我们节点信息 Kafka是什么时候不依赖Zookeeper节点了 在Kafka2.8.0开始就可以不依赖Zookeeper了 可以用KRaft模式代替Zookeeper管理Kafka集群 KRaft Controller和KRaft Leader的关系 两者关系 Lea…...

C++20新特性

作者&#xff1a;billy 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 前言 C20 是 C 标准中的一个重要版本&#xff0c;引入了许多新特性和改进&#xff0c;包括模块&#xff08;Modules&#xff09;、协程…...

[LUA ERROR] bad light userdata pointer

Cocos2d项目&#xff0c;targetSdkVersion30&#xff0c;在 android 13 设备运行报错: [LUA ERROR] bad light userdata pointer &#xff0c;导致黑屏。 参考 cocos2dx 适配64位 arm64-v8a 30 lua 提示 bad light userdata pointer 黑屏-CSDN博客的方法 下载最新的Cocos2dx …...

Maven 安装配置(完整教程)

文章目录 一、Maven 简介二、下载 Maven三、配置 Maven3.1 配置环境变量3.2 Maven 配置3.3 IDEA 配置 四、结语 一、Maven 简介 Maven 是一个基于项目对象模型&#xff08;POM&#xff09;的项目管理和自动化构建工具。它主要服务于 Java 平台&#xff0c;但也支持其他编程语言…...

JAVA:CloseableHttpClient 进行 HTTP 请求的技术指南

1、简述 CloseableHttpClient 是 Apache HttpComponents 提供的一个强大 HTTP 客户端库。它允许 Java 程序与 HTTP/HTTPS 服务交互&#xff0c;可以发送 GET、POST 等各种请求类型&#xff0c;并处理响应。该库广泛用于 REST API 调用、文件上传和下载等场景。 2、特性 Close…...

WebRTC 客户端与ZLMediaKit通讯

1 web浏览器js方式 要使用 WebRTC 客户端与 ZLMediaKit 通讯&#xff0c;您需要设置一个 WebRTC 客户端并与 ZLMediaKit 进行连接。以下是一个基本的步骤和示例代码&#xff0c;帮助您实现这一目标。 ### 步骤 1. **安装 ZLMediaKit**&#xff1a;确保您已经在服务器上安装并…...

openssl使用

openssl使用 提取密钥对 数字证书pfx包含公钥和私钥&#xff0c;而cer证书只包含公钥。提取需输入证书保护密码 openssl pkcs12 -in xxx.pfx -nocerts -nodes -out pare.key提取私钥 openssl rsa -in pare.key -out pri.key提取公钥 openssl rsa -in pare.key -pubout -ou…...

stm32小白成长为高手的学习步骤和方法

我们假定大家已经对STM32的书籍或者文档有一定的理解。如不理解&#xff0c;请立即阅读STM32的文档&#xff0c;以获取最基本的知识点。STM32单片机自学教程 这篇博文也是一篇不错的入门教程&#xff0c;初学者可以看看&#xff0c;讲的真心不错。 英文好的同学&#xf…...

支持多种网络数据库格式的自动化转换工具——VisualXML

一、VisualXML软件介绍 对于DBC、ARXML……文件的编辑、修改等繁琐操作&#xff0c;WINDHILL风丘科技开发的总线设计工具——VisualXML&#xff0c;可轻松解决这一问题&#xff0c;提升工作效率。 VisualXML是一个强大且基于Excel表格生成多种网络数据库文件的转换工具&#…...

Linux学习笔记16---高精度延时实验

延时函数是很常用的 API 函数&#xff0c;在前面的实验中我们使用循环来实现延时函数&#xff0c;但是使用循环来实现的延时函数不准确&#xff0c;误差会很大。虽然使用到延时函数的地方精度要求都不会很严格( 要求严格的话就使用硬件定时器了 ) &#xff0c;但是延时函数肯定…...