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

【计算机网络】日志与守护进程

文章目录

  • 日志
    • 日志的创建
      • logmessage 函数
        • 日志左边部分实现
        • 日志右边部分实现
    • 完整代码
      • log.hpp(整体实现)
      • err.hpp (错误信息枚举)
  • 守护进程
    • PGID SID TTY 的介绍
    • shell中控制进程组的方式
      • 结论
    • 为什么要有守护进程存在?
    • 守护进程的创建
      • 使用守护进程的条件
      • 守护进程化的函数
      • 自己实现守护进程化
        • 解决组长问题
        • 忽略信号
        • 处理 0 1 2 问题
        • 退出守护进程
    • 完整代码
      • err.hpp(错误信息枚举)
      • daemon.hpp(整体实现)

日志

一般使用cout进行打印,但是cout打印是不规范的
实际上 是采用日志进行打印的

日志的创建

创建一个 log.hpp


日志有自己的日志等级

通过枚举,分别为 调试 常规 告警 一般错误 致命错误 未知错误


logmessage 函数

定义一个函数 logmessage,参数level 为日志等级 ,
为了按照可变参数的方式,来进行格式化输出,所以设置一个format 以及…可变参数(可以给c函数传递任意个数的参数)

日志左边部分实现

输入 man snprintf

将可变参数的内容显示到str字符串中


获取日志等级

设置一个字符串 level_string ,通过tolevelstring函数 将数字转化为字符串


获取时间

输入 man localtime

将time_t转换为 struct tm 结构体类型


该结构体包含 秒 分 时 天


输入 man 3 time


在这里插入图片描述
通过gettime函数 获取时间


日志右边部分实现

为了处理可变参数部分,所以使用vsprintf
输入 man snprintf


将写好的数据放到logRight中

完整代码

log.hpp(整体实现)

#pragma once 
#include<iostream>
#include<string.h>
#include<cstdio>
#include<cstring>
#include<cstdarg>
#include<unistd.h>
#include<sys/types.h>
#include<time.h>const std::string  filename="tecpserver.log";//日志等级
enum{DEBUG=0, // 用于调试INFO  ,  //1 常规WARNING, //2 告警ERROR ,  //3  一般错误FATAL ,  //4 致命错误UKNOWN//未知错误
};static  std::string tolevelstring(int level)//将数字转化为字符串
{switch(level){case DEBUG : return "DEBUG";case INFO  : return "INFO";case WARNING : return "WARNING";case  ERROR : return "ERROR";case FATAL : return "TATAL";default: return "UKNOWN";}
}
std::string gettime()//获取时间
{time_t curr=time(nullptr);//获取time_tstruct tm *tmp=localtime(&curr);//将time_t 转换为 struct tm结构体char buffer[128];snprintf(buffer,sizeof(buffer),"%d-%d-%d %d:%d:%d",tmp->tm_year+1900,tmp->tm_mon+1,tmp->tm_mday,tmp->tm_hour,tmp->tm_min,tmp->tm_sec);return buffer;}
void logmessage(int level, const char*format,...)
{//日志左边部分的实现char logLeft[1024];std::string level_string=tolevelstring(level);std::string curr_time=gettime();snprintf(logLeft,sizeof(logLeft),"%s %s %d",level_string.c_str(),curr_time.c_str());//日志右边部分的实现char logRight[1024]; va_list p;//p可以看作是1字节的指针va_start(p,format);//将p指向最开始vsnprintf(logRight,sizeof(logRight),format,p);va_end(p);//将指针置空//打印日志 printf("%s%s\n",logLeft,logRight);//保存到文件中FILE*fp=fopen( filename.c_str(),"a");//以追加的方式 将filename文件打开//fopen打开失败 返回空指针if(fp==nullptr){return;}fprintf(fp,"%s%s\n",logLeft,logRight);//将对应的信息格式化到流中fflush(fp);//刷新缓冲区fclose(fp);
}

err.hpp (错误信息枚举)

#pragma once enum
{USAGE_ERR=1,SOCKET_ERR,//2BIND_ERR,//3LISTEN_ERR,//4SETSID_ERR,//5OPEN_ERR//6
};

守护进程

网络服务一定在任何时候都能访问,所以这个服务不能受任何用户的登录或者注销各种行为的影响
所以需要将进程进行守护进程化

PGID SID TTY 的介绍

在后台运行sleep 10000


PPID是bash的PID值
PGID是 进程组 (PGID相同就为同一个进程组,以从第一个进程进行命名)
SID 是 会话ID
TTY是 终端 若为?,则说明跟终端没有关系,若为具体的如pts/5,则为终端文件


在终端2中输入,在终端1中可以查看到 两者的PGID相同,所以属于同一个进程组,并且以sleep 1000 作为组长


通过查询会话ID 21668,发现bash的PID PGUD SID 都为21668

shell中控制进程组的方式

查询后台任务 jobs


当再次输入sleep 5000 进行后台运行时,发现前面的编号变成2
该编号为 任务编号


将某一任务提到前台运行 fg + 任务编号

当把1号任务提到前台后,再次使用jobs查询后台任务,就查不到1号任务了
并且其他任务并不受影响


把2号任务提到前台,使用 ctrl z 让服务暂停起来
在暂停后,任务会自动切换到后台


输入 bg 2,让2号任务在后台跑起来

结论

1. 进程组分为 前台任务 和 后台任务

在终端2中创建后台任务和前台任务,在终端1中查询发现,后台任务的(PGID)进程组 和 (SID)会话ID相同 ,而与后台的不同


2. 如果后台任务提到前台,老的前天任务就无法运行

将任务编号为1的后台任务 使用 fg 提到前台后 ,输入 ls pwd 等 指令是没有作用的
会话中 ,只能有一个前台任务在运行
所以当 使用 ctrl c 将1号任务退出后,bash把自己变成了前台任务,所以又可以运行了

为什么要有守护进程存在?

若登录就是创建一个会话,启动进程,会话内部有bash任务,在当前会话中创建新的前后台任务,那如果退出呢?

当退出时,就会销毁会话可能会影响会话内部的所有任务

网络服务器为了不受到用户登录注销的影响,网络服务器 通常以守护进程的方式运行

守护进程的创建

输入 man 2 setsid

设置一个会话,以进程组的组长ID作为新的会话ID

若返回成功,则返回调用进程的PID,若返回失败,则返回-1并设置错误码


想要调用setsid,不可以是组长

如:在一家公司中你是组长,有一天你想不干了 出去创业 是不可以的,因为你手底下有一堆组员
所以要成功出去创业,就必须卸任你的组长身份

使用守护进程的条件

1.忽略异常
2.对 0(标准输入) 1(标准输出) 2(标准错误) 作特殊处理
3.进程的工作路径 可能要更改
4.守护进程是一个全局的进程,不想在某一个用户的目录下,所以从整个系统中从最开始进行索引某些文件

守护进程化的函数

输入 man daemon,提供守护进程化的函数

第一个参数表示 是否更改 工作目录,默认不要改,改为1表示为真
第二个参数表示 要不要关闭 0 1 2, 默认不关

大部分情况下,都是自己实现守护进程,而不是调用该函数

自己实现守护进程化

解决组长问题

当启动时,是在bash中新起一个任务,只有一个进程自成进程组,所以自成组长,操作不被允许

成为组长的一般都是组中的第一个进程,所以只需使其不为第一个进程即可


输入 man fork,创建子进程

fork的返回值:父进程返回子进程的PID值,子进程返回0,失败返回-1


当fork>0时,说明为父进程,则让父进程退出,只剩下子进程,子进程不是进程的第一个,也就不是组长,就可以成功调用setsid

忽略信号

signal的第一个参数 表示 信号 ,第二个参数表示对指定动作的信号设定自定义处理动作


SIGPIPE 表示13号信号


SIG_IGN 为 自定义处理信号处理函数

把1强制转化成函数指针类型 即忽略信号

对13号信号 进行忽略


SIGCHLD信号
子进程在运行时会退出,若父进程不关心子进程退出,子进程就会变成僵尸状态
父进程要使用 wait/waitpid去等待子进程 回收僵尸,获取子进程的退出结果
即父进程进行阻塞式等待(什么都不干,就等待子进程的退出结果)
子进程要退出时,会向父进程发信号 SIGCHLD

所以同样对 SIGCHLD信号 进行忽略


处理 0 1 2 问题

使用日志打印,所以导致有很多输出结果,但输出结果不想往显示器上面打印,所以就需要处理标准输入 标准输出 标准错误


Linux系统提供一个 dev null的字符设备

向dev null 中写入,都会被丢弃 ,从这个文件读什么都读不到 ,立马直接返回


输入 man 2 open,打开文件

若返回成功,则返回 文件描述符,若返回失败,则返回 -1 并将错误码返回
O_RDWR : 读写的方式


重定向函数 :输入 man dup2

可以直接将文件打开,使用dup2重定向
输出重定向对应的文件描述符是1
假设其文件描述符是fd
newfd为oldfd的一份拷贝,最后只剩下oldfd
dup2(fd,1) 即 将标准输出流 重定向到 文件描述符fd中


退出守护进程

输入 kill -9 + 守护进程的PID,即可退出守护进程

完整代码

err.hpp(错误信息枚举)

#pragma once enum
{USAGE_ERR=1,SOCKET_ERR,//2BIND_ERR,//3LISTEN_ERR,//4SETSID_ERR,//5OPEN_ERR//6
};

daemon.hpp(整体实现)

#pragma once
#include<unistd.h>
#include<signal.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include"log.hpp"
#include"err.hpp"void Daemon()//自己实现服务器的守护进程化{//1.忽略信号signal(SIGPIPE,SIG_IGN);//忽略信号signal(SIGCHLD,SIG_IGN);//2.不要成为组长    if(fork()>0)//说明为父进程,则让父进程直接退出{exit(0);}//只剩下子进程//3.新建会话,自己成为会话的话首进程pid_t ret=setsid();if((int)ret==-1)//守护进程失败{logmessage(FATAL,"deamon error,code:%d,string :%s",errno,strerror(errno));exit(SETSID_ERR);//终止程序}//4.可以更改守护进程的工作路径//5.处理 0 1 2 问题int fd=open("/dev/null",O_RDWR);//以读写的方式打开字符设备if(fd<0){logmessage(FATAL,"deamon error,code:%d,string :%s",errno,strerror(errno));exit(OPEN_ERR);//终止程序}   //将标准输入 输出错误 重定向到字符设备中dup2(fd,0);dup2(fd,1);dup2(fd,2);close(fd);} 

相关文章:

【计算机网络】日志与守护进程

文章目录 日志日志的创建logmessage 函数日志左边部分实现日志右边部分实现 完整代码log.hpp(整体实现)err.hpp (错误信息枚举&#xff09; 守护进程PGID SID TTY 的介绍shell中控制进程组的方式结论 为什么要有守护进程存在&#xff1f;守护进程的创建使用守护进程的条件守护进…...

设计模式之职责链模式(ChainOfResponsibility)的C++实现

1、职责链模式的提出 在软件开发过程中&#xff0c;发送者经常发送一个数据请求给特定的接收者对象&#xff0c;让其对请求数据进行处理&#xff08;一个数据请求只能有一个对象对其处理&#xff09;。如果发送的每个数据请求指定特定的接收者&#xff0c; 将带来发送者与接收…...

CGAL Mesh(网格数据)布尔操作

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 Mesh布尔操作是一种在三维计算机图形学中用于组合两个或多个网格(mesh)对象的方法。它可以将两个网格对象组合成一个新的对象,同时保留原始对象的拓扑结构和几何信息。Mesh布尔操作主要有以下三种类型: Union(…...

技术分享| WebRTC之SDP详解

一&#xff0c;什么是SDP WebRTC 是 Web Real-Time Communication&#xff0c;即网页实时通信的缩写&#xff0c;是 RTC 协议的一种Web实现&#xff0c;项目由 Google 开源&#xff0c;并和 IETF 和 W3C 制定了行业标准。 WebRTC是点对点通讯&#xff0c;他的通话建立需要交换…...

Flink Table API/SQL 多分支sink

背景 在某个场景中&#xff0c;需要从Kafka中获取数据&#xff0c;经过转换处理后&#xff0c;需要同时sink到多个输出源中(kafka、mysql、hologres)等。两次调用execute, 阿里云Flink vvr引擎报错&#xff1a; public static void main(String[] args) {final StreamExecuti…...

Vue3 中 导航守卫 的使用

在Vue 3中&#xff0c;导航守卫&#xff08;Navigation Guards&#xff09;用于在路由切换前后执行一些操作&#xff0c;例如验证用户权限、取消路由导航等。Vue 3中的导航守卫与Vue 2中的导航守卫略有不同。下面是Vue 3中导航守卫的使用方式&#xff1a; 全局前置守卫&#xf…...

云原生概论

云原生是一种新兴的技术趋势&#xff0c;它旨在将应用程序设计和部署方式从传统的基础设施转向云端。云原生应用程序是一种针对云环境进行优化的应用程序&#xff0c;能够充分利用云端提供的弹性和可扩展性。本文将探讨云原生的概念、优势、应用场景以及未来发展方向。 一、云…...

hive-sql

hive-常用SQL汇总 查看数据库 -- 查看所有的数据库 show databases; 使用默认的库 -- 下面的语句可以查看默认的库 use default ;查看某个库下的表 -- 查看所有的表 show tables ; -- 查看包含 stu的表 &#xff0c;这种是通配的方法来查看 show tables like *stu*; 查…...

Rspack 创建 vue2/3 项目接入 antdv(rspack.config.js 配置 less 主题)

一、简介 Rspack CLI 官方文档。 rspack.config.js 官方文档。 二、创建 vue 项目 创建项目&#xff08;文档中还提供了 Rspack 内置 monorepo 框架 Nx 的创建方式&#xff0c;根据需求进行选择&#xff09; # npm 方式 $ npm create rspacklatest# yarn 方式 $ yarn create…...

基于centos7完成docker服务的一些基础操作

目录 要求完成 具体操作 1.安装docker服务&#xff0c;配置镜像加速器 2.下载系统镜像&#xff08;Ubuntu、 centos&#xff09; 3.基于下载的镜像创建两个容器 &#xff08;容器名一个为自己名字全拼&#xff0c;一个为首名字字母&#xff09; 4.容器的启动、 停止及重启…...

Microsoft Visual Studio + Qt插件编程出现错误error MSB4184问题

文章目录 报错解决 报错 C:\Users\Administrator\AppData\Local\QtMsBuild\qt_globals.targets(786,7): error MSB4184: 无法计算表达式“[System.IO.File]::ReadAllText(C:\Users\Administrator\AppData\Local\QtMsBuild\qt.natvis.xml)”。 未能找到文件“C:\Users\Administ…...

QT Quick之quick与C++混合编程

Qt quick能够生成非常绚丽界面&#xff0c;但有其局限性的&#xff0c;对于一些业务逻辑和复杂算法&#xff0c;比如低阶的网络编程如 QTcpSocket &#xff0c;多线程&#xff0c;又如 XML 文档处理类库 QXmlStreamReader / QXmlStreamWriter 等等&#xff0c;在 QML 中要么不可…...

Ros noetic Move_base 相关状态位置的获取 实战使用教程

前言: 有一段时间没有更新,这篇文章是为了后续MPC路径跟踪算法开设的帖子用于更新我自己的思路,由于MPC算法,要镶嵌到整个导航任务中去,就绕不开这个move_base包中相关的参数设置和其中相关状态位置的获取和解读等等。 因为最近遇到小车在其他的环境中有些时候,不需要自己…...

【SpringBoot】SpringBoot项目与Vue对接接口的步骤

下面是SpringBoot项目与Vue对接接口的步骤&#xff1a; 创建SpringBoot项目&#xff0c;在项目中添加依赖&#xff0c;如Spring MVC、MyBatis等框架。 在SpringBoot项目中编写接口方法&#xff0c;使用注解标识请求方式&#xff0c;如GetMapping、PostMapping等&#xff0c;并…...

Glog安装与使用

安装 脚本 #!/bin/bash git clone https://github.com/google/glog.git cd glog git checkout v0.4.0 mkdir build && cd build cmake .. make -j4 echo "your password" | sudo -S make install使用 main.cc #include <glog/logging.h>int main(i…...

windows开发环境搭建

下载msys2&#xff0c;官网下载即可&#xff1a; MSYS2 安装其他的编译工具&#xff08;貌似不需要把中间的命令全部执行&#xff09;&#xff1a; MSYS2使用教程——win10系统64位安装msys2最新版&#xff08;msys2-x86_xxxx.exe&#xff09;_msys64_Dreamhai的博客-CSDN博…...

8月17日上课内容 第三章 LVS+Keepalived群集

本章结构 Keepalived概述 keepalived 概述 1.服务功能 故障自动切换 健康检查 节点服务器高可用 HA keepalived工作原理 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案&#xff0c;可以解决静态路由出现的单点故障问题 在一个LVS服务集群中通常有主服务器 (MAST…...

Threejs学习05——球缓冲几何体背景贴图和环境贴图

实现随机多个三角形随机位置随机颜色展示效果 这是一个非常简单基础的threejs的学习应用&#xff01;本节主要学习的是球面缓冲几何体的贴图部分&#xff0c;这里有环境贴图以及背景贴图&#xff0c;这样可以有一种身临其境的效果&#xff01;这里环境贴图用的是一个.hdr的文件…...

LVS+Keepalived群集实验

目录 Keepalived 是什么 Keepalived 功能 Keepalived 模块 工作原理 脑裂现象及解决方案 脑裂 形成脑裂的原因 解决脑裂的几种方法&#xff1a; 为了减少或避免HA集群中出现脑裂现象&#xff0c;我们可以采取以下措施&#xff1a; Keepalived服务主要功能&#xff0…...

软考高级之系统架构师之系统开发基础

架构 场景 场景&#xff08;scenarios&#xff09;在进行体系结构评估时&#xff0c;一般首先要精确地得出具体的质量目标&#xff0c;并以之作为判定该体系结构优劣的标准。为得出这些目标而采用的机制做场景。场景是从风险承担者的角度对与系统的交互的简短描述。在体系结构…...

Web 3.0 安全风险,您需要了解这些内容

随着技术的不断发展&#xff0c;Web 3.0 正在逐渐成为现实&#xff0c;为我们带来了许多新的机遇和挑战。然而&#xff0c;与任何新技术一样&#xff0c;Web 3.0 也伴随着一系列安全风险&#xff0c;这些风险需要被认真对待。在这篇文章中&#xff0c;我们将探讨一些与Web 3.0 …...

万宾科技22款产品入选《城市生命线安全工程监测技术产品名录》

2023年8月17日-18日&#xff0c;由北京市地下管线协会主办的2023首届城市生命线安全与发展大会在北京召开&#xff0c;本次大会汇聚中央及地方政府主管领导、院士专家、行业领袖、龙头代表、产业精英等。 大会聚焦安全监管智慧平台和燃气爆炸、城市内涝、地下管线交互风险、第三…...

MFC 隐藏窗口

亲测能用 改变主窗体的创建方式 将 C***App::InitInstance() 函数中的代码 CMFCApplication1Dlg dlg; m_pMainWnd &dlg; INT_PTR nResponse dlg.DoModal(); 替换为 CMFCApplication1Dlg dlg; m_pMainWnd &dlg; //INT_PTR nResponse dlg.DoModal(); INT_PTR nRe…...

Java数据库连接池原理及spring boot使用数据库连接池(HikariCP、Druid)

和线程池类似&#xff0c;数据库连接池的作用是建立一些和数据库的连接供需要连接数据库的业务使用&#xff0c;避免了每次和数据库建立、销毁连接的性能消耗&#xff0c;通过设置连接池参数可以防止建立连接过多导致服务宕机等&#xff0c;以下介绍Java中主要使用的几种数据库…...

百度商业AI 技术创新大赛赛道二:AIGC推理性能优化TOP10之经验分享

朋友们&#xff0c;AIGC性能优化大赛已经结束了&#xff0c;看新闻很多队员已经完成了答辩和领奖环节&#xff0c;我根据内幕人了解到&#xff0c;比赛的最终代码及结果是不会分享出来的&#xff0c;因为办比赛的目的就是吸引最优秀的代码然后给公司节省自己开发的成本&#xf…...

微服务时代java异常捕捉

一、尽量不要使用e.printStackTrace(),而是使用log打印。 ​反例:​ try{ // do what you want }catch(Exception e){ e.printStackTrace(); } ​ 正例&#xff1a;​ try{ // do what you want }catch(Exception e){ log.info("你的程序有异常啦,{}",e)…...

Hadoop支持LZO压缩

LZO(Lempel-Ziv-Oberhumer)是一种快速压缩算法,特别适用于大数据处理。在Hadoop生态系统中,LZO压缩通常用于Hadoop MapReduce作业的输入和输出数据,以减少存储空间和数据传输的开销。 以下是在Hadoop中使用LZO压缩的一般步骤: 安装LZO库和工具: 首先,需要在Hadoop集群…...

vue3 01-setup函数

1.setup函数的作用: 1.是组合式api的入口2.比beforeCreate 执行更早3.没有this组件实例一开始创建vue3页面的时候是这样的 <template></template> <script> export default{setup(){return{ }} } </script>给容器传参在页面中显示 数据给模板使用,以…...

iOS swift 类似AirDrop的近场数据传输 MultipeerConnectivity 框架

文章目录 1.github上的demo 1.github上的demo insidegui/MultipeerDemo – github insidegui/MultipeerKit – github...

Lnton羚通云算力平台OpenCV-PythonCanny边缘检测教程

Canny 边缘检测是一种经典的边缘检测算法&#xff0c;由 John F. Canny 在 1986 年提出。它被广泛应用于计算机视觉和图像处理领域&#xff0c;用于检测图像中的边缘。 ​【原理】 1. 去噪 由于边缘检测非常容易收到图像的噪声影响&#xff0c;第一步使用 5x5 高斯滤波去除图…...

2023-8-23 滑动窗口

题目链接&#xff1a;滑动窗口 #include <iostream>using namespace std;const int N 1000010;int n, k; int a[N], q[N];int main() {scanf("%d%d", &n, &k);for(int i 0; i < n; i) scanf("%d", &a[i]);int hh 0, tt -1;for(…...

SOA通信中间件常用的通信协议

摘要&#xff1a; SOA&#xff08;面向服务的架构&#xff09;的软件设计原则之一是模块化。 前言 SOA&#xff08;面向服务的架构&#xff09;的软件设计原则之一是模块化。模块化可以提高软件系统的可维护性和代码重用性&#xff0c;并且能够隔离故障。举例来说&#xff0c;…...

解决npm安装依赖失败,node和node-sass版本不匹配的问题

npm安装依赖报错&#xff1a; npm ERR! cb() never called! npm ERR! This is an error with npm itself. 一. 问题描述 用npm安装依赖报错&#xff1a; npm ERR! cb() never called! npm ERR! This is an error with npm itself. Please report this error at: npm ERR! …...

2023 网络建设与运维 X86架构计算机操作系统安装与管理题解

任务描述: 随着信息技术的快速发展,集团计划2023年把部分业务由原有的X86架构服务器上迁移到ARM架构服务器上,同时根据目前的部分业务需求进行了部分调整和优化。 一、X86架构计算机操作系统安装与管理 1.PC1系统为ubuntu-desktop-amd64系统(已安装,语言为英文),登录用户…...

LAMP 架构及Discuz论坛与Wordpress博客搭建

目录 1 LAMP 配置与应用 1.1动态资源与语言 1.2 LAMP 架构的组成 1.2.1 主要功能 2 编译安装Apache http 服务 2.1 环境准备 2.1.1 关闭防火墙及selinux服务 2.1.2 安装依赖环境 2.2 安装软件包 2.2.1 解压软件包 2.2.2 移动apr包 apr-util包到安装目录中&#xff0c;并…...

考研C语言进阶题库——更新51-60题

目录 51.银行系中有很多恒星&#xff0c;H 君晚上无聊&#xff0c;便爬上房顶数星星&#xff0c;H 君将整个银河系看做一个平面&#xff0c;左上角为原点&#xff08;坐标为&#xff08;1, 1&#xff09;&#xff09;。现在有 n 颗星星&#xff0c;他给每颗星星都标上坐标&…...

智能算法挑战赛决赛题目——初中组

题目 1. 判断是否存在重复的子序列 从 m 个字符中选取字符&#xff0c;生成 n 个符号的序列&#xff0c;使得其中没有 2 个相邻的子序列相同。如从 1&#xff0c;2&#xff0c;3&#xff0c;生成长度为 5 的序列&#xff0c;序列“12321”是合格的&#xff0c;而“12323”和“…...

一分钟学算法-递归-斐波那契数列递归解法及优化

一分钟学一个算法题目。 今天我们要学习的是用递归算法求解斐波那契数列。 首先我们要知道什么是斐波那契数列。 斐波那契数列&#xff0c;又称黄金分割数列&#xff0c;是一个经典的数学数列&#xff0c;其特点是第一项&#xff0c;第二项为1&#xff0c;后面每个数字都是前…...

选择Rust,并在Ubuntu上使用Rust

在过去的 8 年里&#xff0c;Rust 一直是开发人员最喜欢的语言&#xff0c;并且越来越被各种规模的软件公司采用。然而&#xff0c;它的许多高级规则和抽象创造了一个陡峭的初始学习曲线&#xff0c;这可能会给人留下 Rust 是少数人的保留的印象&#xff0c;但这与事实相去甚远…...

SVM详解

公式太多了&#xff0c;就用图片用笔记呈现&#xff0c;SVM虽然算法本质一目了然&#xff0c;但其中用到的数学推导还是挺多的&#xff0c;其中拉格朗日约束关于α>0这块证明我看了很长时间&#xff0c;到底是因为悟性不够。对偶问题也是&#xff0c;用了一个简单的例子才明…...

mysql全文检索使用

数据库数据量10万左右&#xff0c;使用like %test%要耗费30秒左右&#xff0c;放弃该办法 使用mysql的全文检索 第一步:建立索引 首先修改一下设置: my.ini中ngram_token_size 1 可以通过 show variables like %token%;来查看 接下来建立索引:alter table 表名 add f…...

opencv 进阶17-使用K最近邻和比率检验过滤匹配(图像匹配)

K最近邻&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;和比率检验&#xff08;Ratio Test&#xff09;是在计算机视觉中用于特征匹配的常见技术。它们通常与特征描述子&#xff08;例如SIFT、SURF、ORB等&#xff09;一起使用&#xff0c;以在图像中找到相似…...

Mac Flutter web环境搭建

获取 Flutter SDK 下载以下安装包来获取最新的 stable Flutter SDK将文件解压到目标路径, 比如: cd ~/development $ unzip ~/Downloads/flutter_macos_3.13.0-stable.zip 配置 flutter 的 PATH 环境变量&#xff1a; export PATH"$PATH:pwd/flutter/bin" // 这个命…...

在外SSH远程连接macOS服务器

文章目录 前言1. macOS打开远程登录2. 局域网内测试ssh远程3. 公网ssh远程连接macOS3.1 macOS安装配置cpolar3.2 获取ssh隧道公网地址3.3 测试公网ssh远程连接macOS 4. 配置公网固定TCP地址4.1 保留一个固定TCP端口地址4.2 配置固定TCP端口地址 5. 使用固定TCP端口地址ssh远程 …...

Dockerfile文件详细

Dockerfile 是一个文本文件&#xff0c;里面包含组装新镜像时用到的基础镜像和各种指令&#xff0c;使用dockerfile 文件来定义镜像&#xff0c;然后运行镜像&#xff0c;启动容器。 dockerfile文件的组成部分 一个dockerfile文件包含以下部分&#xff1a; 基础镜像信息&…...

C语言学习系列-->看淡指针(3)

文章目录 一、字符指针变量二、数组指针变量2.1 概述2.2 数组指针初始化 三、二维数组传参本质四、函数指针五、typedef关键字六、函数指针数组 一、字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 char* 一般使用&#xff1a; #include<stdio.h>int main…...

Java抽象类详解

抽象类 抽象类的概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。比如&#xff1a; 说…...

06-微信小程序-注册程序-场景值

06-微信小程序-注册程序 文章目录 注册小程序参数 Object object案例代码 场景值场景值作用场景值列表案例代码 注册小程序 每个小程序都需要在 app.js 中调用 App 方法注册小程序实例&#xff0c;绑定生命周期回调函数、错误监听和页面不存在监听函数等。 详细的参数含义和使…...

多种方法实现 Nginx 隐藏式跳转(隐式URL,即浏览器 URL 跳转后保持不变)

多种方法实现 Nginx 隐藏式跳转(隐式URL,即浏览器 URL 跳转后保持不变)。 一个新项目,后端使用 PHP 实现,前端不做路由,提供一个模板,由后端路由控制。 Route::get(pages/{name}, [\App\Http\Controllers\ResourceController::class, getResourceVersion])...

视频汇聚云平台EasyCVR视频监控管理平台进行SDN转推的操作步骤

视频汇聚/视频云存储/集中存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等&#xff0c;视频智能分析平台EasyCVR融合性强、开放度…...