Linux学习——守护进程编程
一、守护进程含义及实现过程
1、含义
守护进程(Daemon Process) 是操作系统中一种在后台长期运行的特殊进程,通常不与用户直接交互。它独立于控制终端,用于执行周期性任务或系统服务(如日志管理、网络服务等)。典型的守护进程包括 httpd(Web 服务)、mysqld(数据库服务)等。
2、实现过程
1、守护进程相关概念
进程组:一个或多个进程的集合,进程组由进程组ID标识,进程组长的进程ID和进程组ID一致,并且进程组ID不会由于进程组长的退出而受到影响。
会话周期:一个或多个进程组的集合,比如用户从登陆到退出,这个期间用户运行的所有进程都属于该会话周期。
setsid函数:创建一个新会话,并担任该会话组的组长,调用setsid函数的目的:让进程摆脱原会话,原进程组,原终端的控制。如果,调用setsid的进程不是一个进程组的组长,此函数创建一个新的会话期。
2、创建守护进程的过程
(1)fork()创建子进程,父进程exit()退出;
这是创建守护进程的第一步。由于守护进程是脱离控制终端的,因此,完成第一步后就会在Shell终端里造成程序已经运行完毕的假象。之后的所有工作都在子进程中完成,而用户在Shell终端里则可以执行其他命令,从而在形式上做到了与控制终端的脱离,在后台工作。
(2)在子进程中调用 setsid() 函数创建新的会话;
在调用了fork()函数后,子进程全盘拷贝了父进程的会话期、进程组、控制终端等,虽然父进程退出了,但会话期、进程组、控制终端等并没有改变,因此,这还不是真正意义上的独立开来,而 setsid() 函数能够使进程完全独立出来。
(3)再次 fork() 一个孙进程并让子进程退出;
为什么要再次fork呢,假定有这样一种情况,之前的父进程fork出子进程以后还有别的事情要做,在做事情的过程中因为某种原因阻塞了,而此时的子进程因为某些非正常原因要退出的话,就会形成僵尸进程,所以由子进程fork出一个孙进程以后立即退出,孙进程作为守护进程会被init接管,此时无论父进程想做什么都随它了。
(4)在孙进程中调用 chdir() 函数,让根目录 ”/” 成为孙进程的工作目录;
这一步也是必要的步骤,使用fork创建的子进程继承了父进程的当前工作目录。由于在进程运行中,当前目录所在的文件系统(如“/mnt/usb”)是不能卸载的,这对以后的使用会造成诸多的麻烦(比如系统由于某种原因要进入单用户模式)。因此,通常的做法是让"/"作为守护进程的当前工作目录,这样就可以避免上述的问题,当然,如有特殊需要,也可以把当前工作目录换成其他的路径,如/tmp,改变工作目录的常见函数是chdir。
(5)在孙进程中调用 umask() 函数,设置进程的文件权限掩码为0;
文件权限掩码是指屏蔽掉文件权限中的对应位。比如,有个文件权限掩码是050,它就屏蔽了文件组拥有者的可读与可执行权限。由于使用fork函数新建的子进程继承了父进程的文件权限掩码,这就给该子进程使用文件带来了诸多的麻烦。因此,把文件权限掩码设置为0,可以大大增强该守护进程的灵活性。设置文件权限掩码的函数是umask。在这里,通常的使用方法为umask(0)。
(6)在孙进程中关闭任何不需要的文件描述符,关闭输入输出和错误输出(stdin,stdout,stderr),并将其重定向到/dev/null;
同文件权限码一样,用fork函数新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读写,但它们一样消耗系统资源,而且可能导致所在的文件系统无法卸下。
在上面的第2)步之后,守护进程已经与所属的控制终端失去了联系。因此从终端输入的字符不可能达到守护进程,守护进程中用常规方法(如printf)输出的字符也不可能在终端上显示出来。所以,文件描述符为0、1和2 的3个文件(常说的输入、输出和报错)已经失去了存在的价值,也应被关闭。
(7)守护进程退出处理;
当用户需要外部停止守护进程运行时,往往会使用 kill 命令停止该守护进程。所以,守护进程中需要编码来实现 kill 发出的signal信号处理,达到进程的正常退出。
二、创建一个守护进程
创建一个守护进程一般有 nohup命令、fork()函数和 daemon()函数三种方法,我们分别在阿里云服务器、树莓派上用这三种方式创建一个守护进程。
1、nohup命令
nohup命令是“no hang up”的缩写,意为“不挂断”。它允许用户在系统后台运行命令,并确保命令在终端关闭或用户退出后仍然继续运行。默认情况下,nohup命令会将输出重定向到当前目录下的nohup.out文件中,除非另外指定了输出文件。
编写一个简单的脚本loop.sh:
#!/bin/bash
while true; doecho "Running daemon task..." >> /tmp/daemon.logsleep 10
done
赋予脚本执行权限:
chmod +c loop.sh
使用nohup启动守护进程:
nohup ./loop.sh > /dev/null 2>&1 &
验证守护进程是否运行:
ps aux | grep loop.sh
- 阿里云服务器运行结果
2、fork()函数
fork是复制进程的函数,程序一开始就会产生一个进程,当这个进程(代码)执行到fork()时,fork就会复制一份原来的进程即就是创建一个新进程,我们称子进程,而原来的进程我们称为父进程,此时父子进程是共存的,他们一起向下执行代码。
注意的一点:就是调用fork函数之后,一定是两个进程同时执行fork函数之后的代码,而之前的代码以及由父进程执行完毕。
编写C程序fork_test.c:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>void daemonize() {pid_t pid = fork();if (pid < 0) {perror("fork failed");exit(EXIT_FAILURE);}if (pid > 0) {// 父进程退出exit(EXIT_SUCCESS);}// 子进程继续运行setsid(); // 创建新会话chdir("/"); // 改变工作目录umask(0); // 重设文件权限掩码// 关闭标准输入输出流close(STDIN_FILENO);close(STDOUT_FILENO);close(STDERR_FILENO);// 执行守护任务while (1) {FILE *fp = fopen("/tmp/daemon_fork.log", "a");fprintf(fp, "Daemon running...\n");fclose(fp);sleep(10);}
}int main() {daemonize();return 0;
}
编译程序
gcc -o fork_test fork_test.c
运行守护进程
./fork_test
验证守护进程是否运行
ps aux | grep fork_test
- 阿里云服务器运行结果
3、daemon()函数
编写c程序daemon_test.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main() {// 调用 daemon() 函数if (daemon(1, 0) == -1) {perror("daemon failed");exit(EXIT_FAILURE);}// 执行守护任务while (1) {FILE *fp = fopen("/tmp/daemon_builtin.log", "a");fprintf(fp, "Daemon running...\n");fclose(fp);sleep(10);}return 0;
}
编译程序
gcc -o daemon_test daemon_test.c
运行守护进程
./daemon_test
验证守护进程是否运行
ps aux | grep daemon_test
阿里云服务器结果:
三、GDB调试原理
GDB(GNU Debugger)是一个强大的调试工具,用于调试使用C、C++等语言编写的程序。它允许用户在程序执行期间检查变量值、设置断点、单步执行代码以及分析崩溃转储等。
1、基本原理
符号表:当编译一个程序时,如果启用了调试信息(例如通过-g选项),编译器会生成包含函数名、变量名及其类型等信息的符号表。GDB利用这些信息来帮助开发者理解正在运行的程序。
控制流管理:GDB可以暂停(breakpoints)、继续(continue)、单步执行(step into/over)程序的执行流程,以便于观察特定时刻的状态。
数据操作:GDB能够读取和修改程序中变量的值,这有助于测试不同的条件分支或修正错误状态。
信号处理:GDB能够捕获并响应来自操作系统或其他进程的信号(如SIGSEGV、SIGINT等),从而允许对异常情况下的程序进行调试。
远程调试支持:GDB还支持通过网络连接到另一个运行中的程序实例,实现远程调试功能。
2、调试C程序
编写并编译你的C程序:
创建一个名为 test.c 的文件,并编写如下代码:
#include <stdio.h>int add(int a, int b) {return a + b;
}int main() {int x = 5;int y = 7;printf("Sum is %d\n", add(x, y));return 0;
}
然后,使用 -g
选项编译这个程序以包含调试信息:
gcc -g -o test test.c
- 启动GDB调试会话
gdb ./test
- 设置断点
在你感兴趣的函数或行号处设置断点。例如,在 add
函数入口处设置断点:
(gdb) break add
或者按行号设置断点:
(gdb) break test.c:6
- 运行程序
输入 run
来开始执行程序:
(gdb) run
程序将在遇到第一个断点时暂停。
- 检查状态
使用命令查看当前局部变量的值:
(gdb) print a
(gdb) print b
也可以查看调用栈信息:
(gdb) backtrace
- 单步执行
使用 next
或 step
命令逐行执行代码。区别在于 step
会进入函数内部,而 next
则跳过函数调用直接到下一行。
(gdb) next
(gdb) step
- 结束调试
完成调试后,你可以使用 quit
退出GDB:
(gdb) quit
四、SSH反向代理树莓派
1、 确保树莓派和阿里云服务器的 SSH 服务正常运行
检查树莓派的ssh服务
sudo systemctl status ssh
如果未启用,请启动并设置开机自启:
sudo systemctl enable ssh
sudo systemctl start ssh
检查阿里云服务器的SSH服务
sudo systemctl status ssh
2、在阿里云服务器上检查端口是否被占用
sudo netstat -tuln | grep 9624
如果有输出,说明该端口已被占用,否则,该端口可以使用。
3、在树莓派上建立 SSH反向代理
使用 ssh
命令建立反向隧道,将树莓派的 SSH 服务映射到阿里云服务器的指定端口(例如:9699
):
ssh -R 9699:localhost:22 huhs@114.55.126.125
// huhs:阿里云服务器的登录用户
// 9699:指定远程端口
// 114.55.126.125 阿里云服务器公网IP
在阿里云服务器上运行下面命令,测试是否可以通过localhost:9699
访问树莓派
ssh -p 9699 hhs@localhost
// xlq:树莓派登录用户
// localhost: 指的是阿里云服务器的本地回环接口(即 127.0.0.1)
直接从外网访问树莓派
ssh -p 9699 hhs@114.55.126.125
相关文章:
Linux学习——守护进程编程
一、守护进程含义及实现过程 1、含义 守护进程(Daemon Process) 是操作系统中一种在后台长期运行的特殊进程,通常不与用户直接交互。它独立于控制终端,用于执行周期性任务或系统服务(如日志管理、网络服务等ÿ…...
【C++】 —— 笔试刷题day_19
一、小易的升级之路 题目解析 小易现在要打游戏,现在游戏角色的初始能力值为a,我们会遇到n个怪,这些怪物的防御值为b1、b2、b3...,如果我们的能力值要高于或者等于怪物的防御值,那我们的能力值就会加bi;如…...
gitee提交大文件夹
# 安装 Git LFS(如果未安装) git lfs install# 跟踪整个大文件夹(或特定大文件类型) git lfs track "big_folder/**" # 替换为你的文件夹名# 提交并推送 git add .gitattributes big_folder/ git commit -m "add …...
纯CSS实现自动滚动到底部
<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>自动滚动到底部</title><style>*…...
WInform当今技术特性分析
Windows Forms (WinForms) 技术特性分析 引言 Windows Forms (WinForms) 作为微软最早推出的基于.NET的图形用户界面开发框架,已经存在了20多年。在如今充满了各种现代UI框架的软件开发生态系统中,WinForms仍然保持着其独特的地位。本文将深入分析WinF…...
6.5 GitHub监控系统实战:双通道采集+动态调度打造高效运维体系
GitHub Sentinel Agent 定期更新功能设计与实现 关键词:GitHub API 集成、定时任务调度、Python 爬虫开发、SMTP 邮件通知、系统稳定性保障 1. GitHub 项目数据获取功能 1.1 双通道数据采集架构设计 #mermaid-svg-ZHJIMXcMAyDHVhmV {font-family:"trebuchet ms",v…...
自动驾驶安全模型研究
自动驾驶安全模型研究 自动驾驶安全模型研究 自动驾驶安全模型研究1.自动驾驶安全模型概述2. 自动驾驶安全模型应用3. 自动驾驶安全模型介绍3.1 Last Point to Steer3.2 Safety Zone3.3 RSS (Responsibility-Sensitive Safety)3.4 SFF (Safety Force Field)3.5 FSM (Fuzzy Safe…...
4090租用,各云GPU平台价格对比清单及建议
根据各平台的价格和型号配置,以下是通过DeepSeek-R1进行分析后,给出的建议。 一、按显存需求推荐 1.24G显存需求(适合常规AI训练/推理、中小模型) 性价比首选:智星云(1.35元/小时) ࿰…...
Linux:简单指令(二)
文章目录 man ~~echocatcp指令which ~~mvless时间相关的指令find 要么对内容要么对属性操作 决定路径开始定位文件,也可以相对路径 家目录/ man ~~ 1查询具体命令 我们可以man man 可以看man 的描述 我们可以man 数字 ~~ 可以从上到下查询 2查询仿命令 3查询具体接口…...
代码随想录算法训练营day7(字符串)
华子目录 反转字符串中的单词思路 右旋字符串思路 反转字符串中的单词 https://leetcode.cn/problems/reverse-words-in-a-string/description/ 思路 先将字符串s按照空格切分为列表s_list(使用s.split())再进行反转操作再将列表拼接为字符串ÿ…...
Android studio—socketIO库的emit与return的使用
文章目录 一、Socket.IO库简单使用说明1. 后端 Flask Flask-SocketIO2. Android 客户端集成 Socket.IO3. 布局文件注意事项 二、接受服务器消息的二种方法1. 客户端接收通过 emit 发送的消息功能使用场景后端代码(Flask-SocketIO)客户端代码(…...
【Drools+springboot3规则匹配】
文章目录 一、 业务场景概述二、整体技术架构三、Drools概述1. Drools 简介2. Drools Rete 算法与flink-cep的区别?2.1 Rete 算法概述2.2 Flink CEP 概述四、代码实现4.1 导入依赖4.2 从kafka消费数据4.3 核心类,触发匹配操作并将匹配数据写入mysql4.4 Drools 管理4.5 相关的…...
MAC-如果是分页查询,怎么分批次in;基于多线程的分页查询工具类
如果是分页查询,in怎么分批 在处理分页查询时,如果 IN 子句中的参数数量过大(例如超过数据库限制,如 MySQL 的 max_allowed_packet 或性能瓶颈),可以通过 分批查询 和 结果合并 的方式解决。以下是具体实现步骤: 1. 核心思路 将大的 IN 列表拆…...
【MySQL】Ubuntu下C++连接MySQL
C连接MySQL ubuntu下载MySQL1.构建mysql对象,获得mysql访问句柄2.mysql的连接3.向mysqld下达命令(增删改)3.C_C查询细节处理3.1 下达查询命令3.2 转储查询结果3.3显示查询结果 4.编译链接 ubuntu下载MySQL sudo apt install libmysqlclient-dev下载完毕,…...
二月公开赛 宝塔搭建Web-ssrfme环境以及漏洞复现
一.环境搭建 1.1宝塔安装docker 1.2将Web-ssrfme压缩文件放入Ubuntu并解压 rooteden-virtual-machine:/# mkdir Web-ssrfmerooteden-virtual-machine:/Web-ssrfme# ll total 2956 drwxr-xr-x 2 root root 4096 4月 18 02:43 ./ drwxr-xr-x 24 root root 4096 4月 18…...
2021 CCF CSP-S2.廊桥分配
目录 题目算法标签: 模拟, 贪心, 堆思路代码 题目 4090. 廊桥分配 算法标签: 模拟, 贪心, 堆 思路 可以将每个飞机的起始时间和离开时间看作一个线段, 每个廊桥在同一时间只能服务一架飞机, 因为先到先得因此是按照起始时间进行排序 每个廊桥只关心最后一架飞机离开的时刻…...
博客标题栏添加一个 About Me
文章目录 ✅ 目标✍️ 第一步:创建 About 页面🧭 第二步:在导航栏添加菜单项🔄 第三步:重新启动本地服务🪄 可选美化:自定义样式💡 小贴士🎉 示例✅ 文件路径:✅ 页面代码…...
transient关键字深度解析
Java transient 关键字深度解析 1. 核心概念 (1) 基本定义 作用:标记字段不参与序列化 适用场景: 敏感数据(如密码、密钥) 临时计算字段 依赖运行时环境的字段(如Thread对象) (2) 语法示例 java public class User implements Serializable {private String username…...
解决 pip install tts 报错问题-—SadTalker的AI数字人视频—未来之窗超算中心
pip install -r requirements.txt pip install TTS0.11.1 指定版本 pip install TTS0.11.1...
Java 数据类型全解析:基础、引用与包装类全面梳理
Java 中的数据类型分为两大类: 🧩 一、基本数据类型(Primitive Types) 共 8 种,分为 数值类型、字符类型、布尔类型: 类型占用内存默认值说明byte1 字节0整数类型,范围 -128 ~ 127short2 字节…...
Linux计划任务详解:原理、优缺点及应用
Linux计划任务详解:原理、优缺点及应用 文章目录 Linux计划任务详解:原理、优缺点及应用计划任务的基本原理Cron工作原理At工作原理 计划任务的优缺点优点缺点 crontab 命令详解:用法与选项全指南基本语法常用选项详解1. 编辑 cron 任务 (-e)…...
MODBUS TCP 转 CANOpen
一、产品概述 1.1 产品用途 SG-TCP-COE-210 网关可以实现将 CANOpen 接口设备连接到 MODBUS TCP 网络中。用户不需要了解具体的 CANOpen 和 Modbus TCP 协议即可实现将 CANOpen 设备挂载到 MODBUS TCP 接口的 PLC 上,并和 CANOpen 设备进行 数…...
00.IDEA 插件推荐清单(2025)
IDEA 插件推荐清单 精选高效开发必备插件,提升 Java 开发体验与效率。 参考来源:十六款好用的 IDEA 插件,强烈推荐!!!不容错过 代码开发助手类 插件名称功能简介推荐指数CodeGeeX智能代码补全、代码生成、…...
2D物体检测学习
DETR 1.提出了一种新的检测思路,将目标检测任务视作为集合预测问题 2.此前的检测器大都先用手工设计的候选框预测方案,例如anchor或滑动框。这些方案也包含了其他先验知识的干涉,例如NMS等后处理方案、anchor的设计、训练时如何将检测结果与…...
#手动控制windows更新时间(非常安全,可随时恢复)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 第一步: 点一下暂停更新 第二步: 打开注册表,修改过期时间 ps: 若想恢复更新 , 只需要点"继续更新"...
SAP案例:珠海汉胜科技SAP S/4 HANA智能制造实践与价值实现
客户简介 珠海汉胜科技股份有限公司为高科技生产企业,成立于1985年,拥有员工近2000人。主要从事生产、销售、研发:光纤光缆、电线、电缆及附件、铝塑复合管;光纤光缆、电缆、电线生产项目的策划及技术咨询。它致力于为国内外无线电…...
计算机视觉---相机标定
相机标定在机器人系统中的作用 1.确定相机的内部参数 相机的内部参数包括焦距、主点坐标、像素尺寸等。这些参数决定了相机成像的几何关系。通过标定,可以精确获取这些参数,从而将图像中的像素坐标与实际的物理坐标建立联系。例如,已知相机…...
微信小程序的全局变量(quanjubianliang)
在微信小程序开发中,管理和使用全局变量是一种常见的需求。例如,可以通过小程序的App实例和globalData对象来实现全局变量的存储和共享。以下是详细说明: 1. 全局变量的定义 微信小程序提供了 App() 函数,其中可以定义一个 global…...
Kotlin协程Semaphore withPermit约束并发任务数量
Kotlin协程Semaphore withPermit约束并发任务数量 import kotlinx.coroutines.* import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withPermit import kotlinx.coroutines.launch import kotlinx.coroutines.runBlockingfun main() {val permits 1 /…...
LangChain, MCP Server, Qwen-Agent等测试及问题记录
LangChain LangGraph 参考官方文档:https://langchain-ai.github.io/langgraph/tutorials/introduction/ 1. 这里使用Qwen系列模型进行测试 由于想测试通过LangGraph编排让大模型调用工具,所以首先查询支持Function Calling的大模型: https://help.a…...
学习设计模式《一》——简单工厂
一、基础概念 1.1、接口 简单的说:接口是【用来实现类的行为定义、约束类的行为】(即:定义可以做什么);接口可以包含【实例方法】、【属性】、【事件】、【索引器】或这四种成员类型的任意组合。 接口的优点࿱…...
51单片机实验三:数码管动态显示
目录 一、实验环境与实验器材 二、实验内容及实验步骤 1. 数码管动态扫描0-5 2. 利用余辉效应使单片机数码管“同时显示”0-5。 3. B站小仿真(动态原理显示hello) 一、实验环境与实验器材 环境:Keli,STC-ISP烧写软件,Proteus…...
[TriCore][TC3XX][用户手册] - 16.中断控制器 - IR
关键词: TC3XX 用户手册;TC3XX Interrupt Router;TC397 用户手册;TC397 中断控制器; 简介: 本篇为英飞凌 TC3XX 用户手册第 16 章翻译 - Interrupt Router (IR) 手册适用于 TC3XX(包括 TC397…...
Python语言基础教程(上)4.0
✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…...
快速入门smolagents
官方教程地址:Agents - Guided tour 1. 安装 pip install smolagents[litellm] 或者 uv add smolagents[litellm] 2. 配置api key 这里我用的火山的api,注意如果是使用的火山或阿里云的这种服务商的api,model_id这里要以"openai/&qu…...
第 3 期:逆过程建模与神经网络的作用(Reverse Process)
一、从正向扩散到逆向去噪:生成的本质 在上期中我们讲到,正向扩散是一个逐步加入噪声的过程,从原始图像 x_0到接近高斯分布的 x_T: 而我们真正关心的,是从纯噪声中逐步还原原图的过程,也就是逆过程&…...
RAG-概述
RAG 概述 RAG(Retrieval Augmented Generation, 检索增强生成)是一种技术框架,其核心在于当 LLM 面对解答问题或创作文本任务时,首先会在大规模文档库中搜索并筛选出与任务紧密相关的素材,继而依据这些素材精准指导后续…...
Python 中的数据类型有哪些
Python 中的数据类型有哪些? Python 是一种动态类型语言,支持多种内置数据类型,并且可以自定义数据类型。以下是 Python 中常见和重要的数据类型: 一、基本数据类型 整数(int) 表示整数,没有小…...
梯度下降,共轭梯度,牛顿法,拟牛顿法的收敛速度对比
一、收敛速度理论对比 方法收敛速度(一般非线性函数)收敛速度(二次凸函数)局部收敛性(接近极小点时)收敛阶梯度下降(GD)线性收敛(Linear)线性收敛࿰…...
深入浅出目标检测:从入门到YOLOv3,揭开计算机视觉的“火眼金睛”
目录 揭开目标检测的神秘面纱 什么是目标检测?为什么它如此重要?定义:图像分类、目标检测、目标跟踪、实例分割的区别与联系应用场景讲解目标检测的输出:边界框 (Bounding Box) 和类别 (Class)目标检测在AI领域的地位和发展趋势&…...
Odoo:免费开源的轧制品行业管理软件
Odoo免费开源的轧制品行业管理软件能够帮助建材、电线电缆、金属、造纸包装以及纺织品行业提高韧性和盈利能力,构筑美好未来。 文 | 开源智造(OSCG)Odoo金牌服务 提高供应链韧性,赋能可持续发展 如今,金属…...
51单片机实验六:通用型1602液晶操作方法
目录 一、实验环境与实验器材 二、实验内容及实验步骤 1. 目标:用C语言编程,实现在1602液晶的第一行显示“I LOVE MCU!”,在第二行显示WWW.TXMCU.COM。 2.目标:用C语言编程,实现第一行从右侧移入“Hello everyone!”…...
原型模式详解及c++代码实现(以自动驾驶感知场景为例)
模式定义 原型模式(Prototype Pattern)是一种创建型设计模式,通过克隆已有对象来创建新对象,避免重复执行昂贵的初始化操作。该模式特别适用于需要高效创建相似对象的场景,是自动驾驶感知系统中处理大量重复数据结构的…...
datasheet数据手册-阅读方法
DataSheet Datasheet(数据手册):电子元器件或者芯片的数据手册,一般由厂家编写,格式一般为PDF,内容为电子分立元器件或者芯片的各项参数,电性参数,物理参数,甚至制造材料…...
C言雅韵集:野指针
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…...
2 celery环境搭建
1. 安装 Celery 及依赖 1.1 安装 Celery 使用 pip 安装 Celery(推荐 Python 3.7 环境): pip install celery1.2 选择并安装 Broker Celery 需要一个消息中间件(Broker)来传递任务。以下是两种常用 Broker 的安装方…...
alertManager部署安装、告警规则配置详解及告警消息推送
java接受告警请求RestController RequestMapping("/alert") Slf4j public class TestApi {private static final DateTimeFormatter FORMATTER DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");RequestMappingpublic void sendTemplate(HttpServl…...
day45——非递减数列(LeetCode-665)
题目描述 给你一个长度为 n 的整数数组 nums ,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。 我们是这样定义一个非递减数列的: 对于数组中任意的 i (0 < i < n-2),总满足 nums[i] < nums[i …...
LeetCode19.删除链表的倒数第N个节点
题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。请用一次扫描实现 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出ÿ…...
Kafka系列之:计算kafka集群topic占的存储大小
Kafka系列之:计算kafka集群topic占的存储大小 topic存储数据格式统计topic存储大小定时统计topic存储大小topic存储数据格式 单位是字节大小 size_bytes{directory="/data/datum/kafka/optics-all" } 782336计算topic存储大小脚本逻辑是: 计算指定目录或文件的大小…...