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

【Linux探索学习】第二十七弹——信号(一):Linux 信号基础详解

Linux学习笔记:

https://blog.csdn.net/2301_80220607/category_12805278.html?spm=1001.2014.3001.5482

前言:

前面我们已经将进程通信部分讲完了,现在我们来讲一个进程部分也非常重要的知识点——信号,信号也是进程间通信的一种,本篇主要讲解信号的概念和信号的几种产生方法及对应的场景

目录

一、引言

二、信号的概念

2.1 什么是信号

2.2 信号的作用

2.3 信号的特点

2.4 常见信号列表

​编辑

三、信号的产生

3.1 前台进程和后台进程

3.2 用户产生信号

3.3 系统产生信号

3.4 软件产生信号

四、信号的处理

4.1 默认处理方式

4.2 自定义信号处理函数

五、总结


一、引言

在 Linux 操作系统中,信号(Signal)是一种进程间通信(IPC,Inter - Process Communication)的机制,它用于通知进程发生了某种异步事件。信号可以来自内核,也可以来自其他进程。进程接收到信号后,会根据信号的类型以及自身的处理方式做出相应的反应。理解信号对于编写健壮的 Linux 程序以及深入理解 Linux 操作系统的运行机制至关重要。

二、信号的概念

2.1 什么是信号

信号是一种软中断,它是一种异步通知机制。当某个特定事件发生时,如用户按下特定组合键、系统资源耗尽、进程异常终止等,系统会向相关进程发送一个信号。每个信号都有一个对应的编号和名称,例如信号 1 表示 SIGHUP(挂起信号),信号 9 表示 SIGKILL(强制终止信号)。

2.2 信号的作用

信号的主要作用是让进程能够对异步事件做出响应。例如,当用户在终端中按下 Ctrl + C 组合键时,系统会向当前前台进程发送 SIGINT 信号,通常进程会接收到这个信号后停止当前正在执行的任务并退出。信号还可以用于进程间的通信,一个进程可以向另一个进程发送信号来通知其执行某些操作。

结合2.1和2.2我们来讲解一个概念:信号是一种软中断,是什么意思呢?当我们往键盘中输入内容时是如何告诉给内核的?ctrl+c又是如何被解释为指令的呢?

我们先来看下面这张图:

        键盘实际上是通过中断来让操作系统知道自己要写入内容的,键盘被按下时,就会触发硬件中断,不同的硬件对应着不同的中断号,中断单元就可以通过它们的中断号将它们与CPU中不同的键位相连,从而使CPU中这个方向的寄存器(32位)特定位置产生电信号,操作系统中有一个叫中断向量表的类似于函数指针结构体的结构,里面保存着访问各种外设的方法,操作系统通过CPU产生的电信号就辨别出要获取哪种硬件的信息,从而通过中断向量表中的方法,将硬件中的信息拷贝到操作系统的文件缓冲区中(操作系统下一切皆文件,且每一个文件都有自己的文件缓冲中区),然后再拷贝到用户缓冲区
       同时比如键盘等外键,操作系统在获取键盘上的信息时会先进行识别,会对数据进行判断,如果是控制进程的比如ctrl+c等组合键就不会往缓冲区中拷贝,我们可以发现我们学习的信号与上面的中断过程很像,其实信号,就是用软件方式,模拟的对讲程的硬件中断,所以信号也被叫做软中断

2.3 信号的特点

  1. 异步性:信号的产生是异步的,与进程的执行顺序无关。进程在运行过程中可能随时收到信号。
  1. 简单性:信号机制相对简单,只需要一个信号编号就可以标识不同的信号。
  1. 有限性:Linux 系统中定义的信号数量是有限的,不同的系统可能略有差异,但通常在几十种左右。

2.4 常见信号列表

信号编号

信号名称

含义

默认处理方式

1

SIGHUP

挂起信号,通常在终端关闭时发送给相关进程

终止进程

2

SIGINT

中断信号,由用户按下 Ctrl + C 组合键产生

终止进程

3

SIGQUIT

退出信号,由用户按下 Ctrl + \ 组合键产生

终止进程并生成核心转储文件

9

SIGKILL

强制终止信号,不能被捕获、阻塞或忽略

立即终止进程

15

SIGTERM

终止信号,通常用于正常终止进程

终止进程

18

SIGCONT

继续信号,用于恢复被暂停的进程

继续执行进程

19

SIGSTOP

停止信号,用于暂停进程,不能被捕获、阻塞或忽略

暂停进程

可以通过kill -l指令查看所有信号

kill -l

三、信号的产生

3.1 前台进程和后台进程

先来科普一个小知识点:前台进程和后台进程,来看下面一个程序

#include<iostream>
#include<unistd.h>
using namespace std;
int main()
{while(true){cout<<"I am a crazy process"<<endl;sleep(1);}return 0;
}

我们进行编译后会得到一个可执行程序

./myfile

我们这样执行时我们会发现在程序运行的时候,我们输入其它指令比如Is,pwd等都不会有结果,进程还在继续运行,除非用ctrl+c终止掉进程,这样的进程称为前台进程

./myfile &

这种的后面加上地址符的叫做后台进程,后台进程可以被其它进程命令临时打断并执行这个命令,比如我们输入ls指令,进程就会暂停并且输出Is的结果,但是最后需要自己把进程结束掉

Linux中,一次登陆中, 一个终端,一般会配上一个bash,每一个登陆,只允许一个进程是前台进程,可以允许多个进程是后台进程
当./process运行时,输入指令之所以不能运行就是因为此时的前台进程由bash转变为了process

  • 终端占用情况
    • 前台进程:会独占终端,直到进程执行完成或者被挂起,在这期间终端无法接受其他命令输入,用户只能与该进程进行交互。
    • 后台进程:不会占用终端,终端可以继续接受用户输入的其他命令,用户可以在同一个终端中同时启动多个后台进程,并随时切换到其他任务。
  • 运行特性
    • 前台进程:其执行过程会受到用户操作的直接影响,比如用户可以通过键盘输入来中断或暂停进程。如果终端关闭,前台进程通常会被终止,除非进行了特殊的设置。
    • 后台进程:通常是长时间运行的,不受终端关闭的影响,除非明确地对其进行停止或重启操作。它按照自身的逻辑和任务需求在后台持续运行,不会因为用户的一些常规操作而中断。

3.2 用户产生信号

  1. 键盘输入:用户可以通过在终端中按下特定的组合键来产生信号。例如:
    • Ctrl + C:产生 SIGINT 信号,用于中断当前正在运行的进程。比如,我们在终端中运行一个长时间运行的命令while true; do echo "Hello"; sleep 1; done,按下 Ctrl + C 后,该命令对应的进程会接收到 SIGINT 信号并终止。
    • Ctrl + \:产生 SIGQUIT 信号,不仅会终止进程,还会生成核心转储文件(如果系统配置允许,一般在云服务器上是默认关闭的,虚拟机上可能是开启的)。例如,运行一个简单的 C 程序#include <stdio.h> int main() { while(1); return 0; },编译运行后,按下 Ctrl + \,进程会终止并生成核心转储文件(在当前目录下,文件名为 core,具体名称和位置可能因系统配置而异)。(了解即可,这个生成core文件的内容与进程退出部分也有联系,有想了解的可以单独去搜索一下)
  1. 使用 kill 命令:用户可以使用 kill 命令向指定进程发送信号。kill 命令的基本语法是kill [信号编号] 进程ID。例如,要向进程 ID 为 1234 的进程发送 SIGTERM 信号(信号编号为 15),可以在终端中输入kill -15 1234,也可以使用信号名称kill -SIGTERM 1234。如果省略信号编号或名称,默认发送 SIGTERM 信号。

3.3 系统产生信号

  1. 进程异常:当进程发生异常时,如段错误(访问非法内存地址)、除零错误等,系统会向该进程发送相应的信号。
    • 段错误(Segmentation Fault):当进程访问了不属于它的内存区域时,会产生段错误,一般都是野指针问题,系统会向该进程发送 SIGSEGV 信号。例如,下面的 C 代码会导致段错误:
#include <stdio.h>int main() {int *ptr = NULL;*ptr = 10; // 试图向空指针指向的地址写入数据,会引发段错误return 0;}

编译运行这段代码,程序会崩溃,并提示 “Segmentation fault”,这是因为进程接收到了 SIGSEGV 信号。

  • 除零错误(Division by Zero):当进程执行除法运算时,如果除数为零,会产生除零错误,系统会向该进程发送 SIGFPE 信号。例如:
#include <stdio.h>int main()
{int a = 10;int b = 0;int c = a / b; // 除零操作,会引发除零错误return 0;
}

运行这段代码,程序会崩溃,并提示 “Floating point exception”,这是因为进程接收到了 SIGFPE 信号。

2. 系统资源相关:当系统资源达到一定阈值时,也可能产生信号。例如,当进程使用的内存超过了系统限制时,系统可能会发送 SIGKILL 信号来终止该进程,以防止系统内存耗尽。不过,这种情况通常需要系统进行相关的配置和监控。

3.4 软件产生信号

  1. 使用 kill 函数:在 C 语言编程中,可以使用 kill 函数向指定进程发送信号。kill 函数的原型可以用man手册查看,如下:
 man 2 kill

其中,pid 是目标进程的 ID,sig 是要发送的信号编号。例如,下面的代码演示了如何使用 kill 函数向另一个进程发送 SIGTERM 信号:

#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
int main()
{pid_t target_pid = 1234; // 假设目标进程ID为1234int result = kill(target_pid, SIGTERM);if (result == -1){perror("kill failed");}else{printf("SIGTERM sent to process %d\n", target_pid);}return 0;
}

在实际使用中,需要将target_pid替换为真实的目标进程 ID。

2. 使用 raise 函数:进程可以使用 raise 函数向自身发送信号。raise 函数的原型也可以通过man手册来查看,如下:

man raise

其中,sig 是要发送的信号编号。例如,下面的代码演示了如何使用 raise 函数向自身发送 SIGINT 信号:

#include <stdio.h>
#include <signal.h>
int main()
{int result = raise(SIGINT);if (result != 0){perror("raise failed");}else{printf("SIGINT sent to self\n");}return 0;
}

运行这段代码,进程会接收到自己发送的 SIGINT 信号并终止。

四、信号的处理

4.1 默认处理方式

每个信号都有一个默认的处理方式,常见的默认处理方式包括:

  1. 终止进程:如 SIGINT、SIGTERM 等信号的默认处理方式是终止进程。
  1. 生成核心转储文件并终止进程:例如 SIGQUIT 信号,在终止进程的同时会生成核心转储文件,该文件包含了进程在收到信号时的内存状态等信息,可用于调试程序。
  1. 忽略信号:有些信号(如 SIGCHLD,子进程状态改变时发送给父进程的信号)的默认处理方式是忽略。

4.2 自定义信号处理函数

进程可以通过调用 signal 函数或 sigaction 函数来设置自定义的信号处理函数。

  1. signal 函数:signal 函数的原型如下:
man signal

其中,signum 是信号编号,handler 是指向信号处理函数的指针。例如,下面的代码演示了如何使用 signal 函数设置 SIGINT 信号的自定义处理函数:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void signal_handler(int signum)
{printf("Received SIGINT. Cleaning up...\n");// 在这里进行一些清理工作,如关闭文件、释放资源等_exit(0); // 退出进程
}
int main()
{signal(SIGINT, signal_handler);while (1){printf("Running...\n");sleep(1);}return 0;
}

在这个例子中,当进程接收到 SIGINT 信号时,会调用signal_handler函数,而不是默认的终止进程操作。

2. sigaction 函数:sigaction 函数比 signal 函数提供了更丰富的功能,它可以设置信号处理函数、处理信号时的掩码、信号的标志等。sigaction 函数的原型如下:

#include <signal.h>int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);struct sigaction {void (*sa_handler)(int);void (*sa_sigaction)(int, siginfo_t *, void *);sigset_t sa_mask;int sa_flags;void (*sa_restorer)(void);};

其中,signum 是信号编号,act 是指向新的信号处理动作的结构体指针,oldact 是指向旧的信号处理动作的结构体指针(如果不需要获取旧的处理动作,可以设为 NULL)。例如,下面的代码演示了如何使用 sigaction 函数设置 SIGINT 信号的自定义处理函数:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void signal_handler(int signum)
{printf("Received SIGINT. Cleaning up...\n");// 在这里进行一些清理工作,如关闭文件、释放资源等_exit(0); // 退出进程
}
int main()
{struct sigaction new_action, old_action;new_action.sa_handler = signal_handler;sigemptyset(&new_action.sa_mask);new_action.sa_flags = 0;sigaction(SIGINT, &new_action, &old_action);while (1){printf("Running...\n");sleep(1);}return 0;
}

这段代码与使用 signal 函数的例子功能类似,但使用 sigaction 函数可以更灵活地配置信号处理方式。

五、总结

信号是 Linux 系统中一种重要的进程间通信和异步事件通知机制。通过本文,我们详细了解了信号的概念,信号的产生和部分信号的处理工作,后面我们还会讲解信号的捕捉等处理工作,学习信号可以帮助我们更好的实现进程通信和异步处理等诸多操作

本篇笔记:


感谢各位大佬观看,创作不易,还请各位大佬点赞支持!!!

相关文章:

【Linux探索学习】第二十七弹——信号(一):Linux 信号基础详解

Linux学习笔记&#xff1a; https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 前面我们已经将进程通信部分讲完了&#xff0c;现在我们来讲一个进程部分也非常重要的知识点——信号&#xff0c;信号也是进程间通信的一…...

有限元分析学习——Anasys Workbanch第一阶段笔记梳理

第一阶段笔记主要源自于哔哩哔哩《ANSYS-workbench 有限元分析应用基础教程》 张晔 主要内容导图&#xff1a; 笔记导航如下&#xff1a; Anasys Workbanch第一阶段笔记(1)基本信息与结果解读_有限元分析变形比例-CSDN博客 Anasys Workbanch第一阶段笔记(2)网格单元与应力奇…...

【YOLOv11改进- 注意力机制】YOLOv11+SCSA注意力机制(2024): 最新空间和通道协同注意力,助力YOLOv11有效涨点;包含二次创新

YOLOV11目标检测改进实例与创新改进专栏 专栏地址:YOLOv11目标检测改进专栏,包括backbone、neck、loss、分配策略、组合改进、原创改进等; 本文介绍 本文给大家带来的改进内容是在YOLOv11中添加SCSA注意力机制,助力有效涨点。作者提出了一种新的空间与通道协同注意模块(S…...

科技快讯 | 理想官宣:正式收费!WeChat 港币钱包拓宽商户网络;百川智能发布深度思考模型Baichuan-M1-preview

理想官宣&#xff1a;正式收费&#xff01; 1月23日&#xff0c;理想汽车宣布&#xff0c;理想超充站超时占用费正式运营。触发超时占用费的条件为充电结束后15分钟内未将充电枪插回充电桩&#xff0c;收费标准为2元/分钟&#xff0c;单次封顶200元。理想汽车将在充电结束的四个…...

LLM架构与优化:从理论到实践的关键技术

标题&#xff1a;“LLM架构与优化&#xff1a;从理论到实践的关键技术” 文章信息摘要&#xff1a; 文章探讨了大型语言模型&#xff08;LLM&#xff09;开发与应用中的关键技术&#xff0c;包括Transformer架构、注意力机制、采样技术、Tokenization等基础理论&#xff0c;以…...

深入理解Pytest中的Setup和Teardown

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 对于简单程序而言&#xff0c;使用 Pytest 运行测试直截了当。然而&#xff0c;当你…...

PostgreSQL 约束

PostgreSQL 约束 引言 在数据库设计中,约束是确保数据完整性和一致性的关键工具。PostgreSQL,作为一款功能强大的开源关系型数据库管理系统,提供了丰富的约束类型来满足不同的数据库设计需求。本文将详细介绍PostgreSQL中的各种约束,包括其定义、用途和实现方法。 一、约…...

JAVA 接口、抽象类的关系和用处 详细解析

接口 - Java教程 - 廖雪峰的官方网站 一个 抽象类 如果实现了一个接口&#xff0c;可以只选择实现接口中的 部分方法&#xff08;所有的方法都要有&#xff0c;可以一部分已经写具体&#xff0c;另一部分继续保留抽象&#xff09;&#xff0c;原因在于&#xff1a; 抽象类本身…...

【微服务与分布式实践】探索 Dubbo

核心组件 服务注册与发现原理 服务提供者启动时&#xff0c;会将其服务信息&#xff08;如服务名、版本、所在节点的网络地址等&#xff09;注册到注册中心。服务消费者则可以从注册中心发现可用的服务提供者列表&#xff0c;并与之通信。注册中心会存储服务的信息&#xff0c…...

lightweight-charts-python 包 更新 lightweight-charts.js 的方法

lightweight-charts-python 是 lightweight-charts.js 的 python 包装&#xff0c;非常好用 lightweight-charts 更新比较频繁&#xff0c;导致 lightweight-charts-python 内置的 lightweight-charts 经常不是最新的。 新的 lightweight-charts 通常可以获得性能改进和bug修复…...

作業系統:設計與實現-母本

2023 南京大學《作業系統:設計與實現》 課程主頁(含講義):https://jyywiki.cn/OS/2023/ 【Python 实现操作系统模型 [南京大学2023操作系统-P4] (蒋炎岩)-哔哩哔哩】 https://b23.tv/jakxDbh 用Python实现操作系统模型讲义 一、操作系统基础概念 1.1 定义 操作系统(Oper…...

穿心莲内酯(andrographolide)生物合成CYP72-文献精读106

Two CYP72 enzymes function as Ent-labdane hydroxylases in the biosynthesis of andrographolide in Andrographis paniculata 两种CYP72酶在穿心莲&#xff08;Andrographis paniculata&#xff09;中作为Ent-labdane羟化酶&#xff0c;在穿心莲内酯&#xff08;andrograp…...

IDM-VTON本地部署教程:双重编码 + 文字提示,解锁真实野外试穿

一、介绍 IDM-VTON&#xff1a;改进扩散模型&#xff0c;实现真实的野外虚拟试穿。 技术原理&#xff1a;改进扩散模型&#xff0c;利用视觉编码器提取服装高级语义信息并与交叉注意力层融合&#xff0c;通过并行 UNet 结构的 GarmentNet 捕捉服装低级特征并与自注意力层结合&…...

【微服务与分布式实践】探索 Sentinel

参数设置 熔断时长 、最小请求数、最大RT ms、比例阈值、异常数 熔断策略 慢调⽤⽐例 当单位统计时⻓内请求数⽬⼤于设置的最⼩请求数⽬&#xff0c;并且慢调⽤的⽐例⼤于阈值&#xff0c;则接下来的熔断时⻓内请求会⾃动被熔断 异常⽐例 当单位统计时⻓内请求数⽬⼤于设置…...

云计算与虚拟化技术讲解视频分享

互联网各领域资料分享专区(不定期更新)&#xff1a; Sheet 前言 由于内容较多&#xff0c;且不便于排版&#xff0c;为避免资源失效&#xff0c;请用手机点击链接进行保存&#xff0c;若链接生效请及时反馈&#xff0c;谢谢~ 正文 链接如下&#xff08;为避免资源失效&#x…...

[c语言日寄]越界访问:意外的死循环

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…...

数据结构---哈希表

基本概念 哈希函数&#xff08;Hash Function&#xff09;是一种将输入的数据&#xff08;通常是任意大小的&#xff09;映射到固定大小的输出&#xff08;通常是一个固定长度的值&#xff09;的函数。这个输出值通常称为“哈希值”&#xff08;Hash Value&#xff09;或“哈希…...

【C语言----数组详解】

目录 ---------------------------------------begin--------------------------------------- 一、什么是数组 二、数组的声明和初始化 1. 数组的声明 2. 数组的初始化 三、数组元素的访问 四、数组的遍历 五、数组的应用 六、多维数组 七、总结 --------------------…...

C语言字符串详解

1. C语言中的字符串基础 C语言中的字符串是程序设计中不可忽视的部分。与现代高级编程语言不同&#xff0c;C语言对字符串的处理方式直接、灵活&#xff0c;并且强大。在C语言中&#xff0c;字符串并不是一种特殊的数据类型&#xff0c;而是字符数组的一种表现形式。字符串通常…...

基础IO(2)

基础IO&#xff08;2&#xff09; 理解“⼀切皆⽂件” ⾸先&#xff0c;在windows中是⽂件的东西&#xff0c;它们在linux中也是⽂件&#xff1b;其次⼀些在windows中不是⽂件的东西&#xff0c;⽐如进程、磁盘、显⽰器、键盘这样硬件设备也被抽象成了⽂件&#xff0c;你可以使…...

深入理解 Python 中的 `__all__`:控制模块的公共接口

在 Python 编程中&#xff0c;模块化设计是构建可维护和可扩展代码的关键。模块不仅帮助我们组织代码&#xff0c;还能通过隐藏实现细节来提高代码的可读性和安全性。Python 提供了多种机制来控制模块的可见性&#xff0c;其中 __all__ 是一个非常重要但常被忽视的特性。本文将…...

Python面试宝典7 | 正则表达式的match()与search(),精准匹配与全局搜索

今天&#xff0c;我们来聊聊Python正则表达式中两个常用的方法&#xff1a;match()和search()。它们都用于在字符串中查找匹配的模式&#xff0c;但有着重要的区别。 理论篇&#xff1a;匹配的起始位置 match()和search()最主要的区别在于它们匹配的起始位置&#xff1a; ma…...

代码随想录算法训练营第三十八天-动态规划-完全背包-279.完全平方数

把目标值当作背包容量&#xff0c;每个平方数当作物品&#xff0c;题目变更为装满指定容量的背包&#xff0c;最小用几个物品会不会出现拼凑不出来的情况&#xff1f;不会&#xff0c;因为有数字1&#xff0c;对任意正整数百分百能拼凑出来因此此题目与上一道题就变得一模一样了…...

996引擎 - NPC-添加NPC引擎自带形象

996引擎 - NPC-添加NPC引擎自带形象 截图参考添加NPC参考资料截图参考 添加NPC 编辑NPC表:Envir\DATA\cfg_npclist.xls 1.1. 需要临时隐藏NPC时可以在id前加 // 1.2. 如果NPC朝向不对,可以调整dir 列。(按8方向,上是0顺时针数。我这里给的4) 1.3. 形象代码:NPC代码、怪物…...

基于 NodeJs 一个后端接口的创建过程及其规范 -- 【elpis全栈项目】

基于 NodeJs 一个后端接口的创建过程及其规范 一个接口的诞生&#xff1a; #mermaid-svg-46HXZKI3fdnO0rKV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-46HXZKI3fdnO0rKV .error-icon{fill:#552222;}#mermaid-sv…...

笔记本跑大模型尝试

1&#xff0c;笔记本电脑资源 我是一台联想笔记本电脑&#xff0c;基本配置如下&#xff1a; CPU&#xff1a;12th Gen Intel(R) Core(TM) i7-1255U 1.70 GHz (12核心&#xff0c;2个P核和8个E核&#xff0c;共计10个核心) 显卡&#xff1a;NVIDIA GeForce MX550 内存&am…...

[论文阅读] (37)CCS21 DeepAID:基于深度学习的异常检测(解释)

祝大家新春快乐&#xff0c;蛇年吉祥&#xff01; 《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0…...

常见端口的攻击思路

端口号端口说明攻击方向21/22/69FTP/TFTP文件传输协议匿名上传/下载、嗅探、爆破2049NFS服务配置不当139Sanba服务爆破、远程代码执行389Ldap目录访问协议注入、匿名访问、弱口令22SSH远程连接爆破、SSH映射隧道搭建、文件传输23Telnet远程连接爆破、嗅探、弱口令3389RDP远程桌…...

复古壁纸中棕色系和米色系哪个更受欢迎?

根据最新的搜索结果&#xff0c;我们可以看到棕色系和米色系在复古壁纸设计中都非常受欢迎。以下是对这两种颜色系受欢迎程度的分析&#xff1a; 棕色系 受欢迎程度&#xff1a;棕色系在复古壁纸中非常受欢迎&#xff0c;因为它能够营造出温暖、质朴和自然的氛围。棕色系的壁纸…...

RocketMQ消息是如何存储的?

大家好&#xff0c;我是锋哥。今天分享关于【RocketMQ消息是如何存储的&#xff1f;】面试题。希望对大家有帮助&#xff1b; RocketMQ消息是如何存储的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RocketMQ 使用了一个高性能、分布式的消息存储架构…...

在FreeBSD下安装Ollama并体验DeepSeek r1大模型

在FreeBSD下安装Ollama并体验DeepSeek r1大模型 在FreeBSD下安装Ollama 直接使用pkg安装即可&#xff1a; sudo pkg install ollama 安装完成后&#xff0c;提示&#xff1a; You installed ollama: the AI model runner. To run ollama, plese open 2 terminals. 1. In t…...

[250128] Apache HTTP Server 2.4.63 发布 | Arm 发布首个芯片系统架构的公开规范

目录 Apache HTTP Server 2.4.63 发布&#xff0c;十五年创新成果&#xff01;Arm 发布首个芯片系统架构的公开规范 Apache HTTP Server 2.4.63 发布&#xff0c;十五年创新成果&#xff01; Apache 软件基金会和 Apache HTTP Server 项目组自豪地宣布 Apache HTTP Server 2.4…...

为什么要学习rust

内存管理&#xff1a;对于我来说&#xff0c;我就喜欢它的内存管理。我做了一个webapi&#xff0c;取100万行数据&#xff0c;导出到xlsx&#xff0c;再把这个xlsx文件发送给前端。分别用了java、c#、go和rust进行了相同的操作。只有rust做到了&#xff0c;启动时8MB内存&#…...

Linux进程调度与等待:背后的机制与实现

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 当一个进程发起某种操作&#xff08;如I/O请求、信号、锁的获取等&#xff09;&#xff0c;但该操作需要的资源暂时不可用时&#xff0c;进程会被操作系统挂起&#xff0c;进入“等待队列”或“阻塞状态”。…...

Linux任务管理与守护进程

文章目录 &#x1f345;任务管理进程组概念作业概念会话概念相关操作前台进程&后台进程jobsfgbgps命令查看指定的选项 &#x1fad2;守护进程守护进程的概念作用守护进程的查看守护进程的创建原生创建守护进程调用daemon函数创建守护进程模拟实现daemon函数 &#x1f345;任…...

《Trustzone/TEE/安全从入门到精通-标准版》

CSDN学院课程连接:https://edu.csdn.net/course/detail/39573 讲师介绍 拥有 12 年手机安全、汽车安全、芯片安全开发经验,擅长 Trustzone/TEE/ 安全的设计与开发,对 ARM 架构的安全领域有着深入的研究和丰富的实践经验,能够将复杂的安全知识和处理器架构知识进行系统整…...

java 字符串日期字段格式化前端显示

在 Java 应用程序中&#xff0c;如果你有一个字符串类型的日期字段&#xff0c;并希望将其格式化后显示在前端&#xff0c;可以通过多种方式实现。这通常涉及到在后端将字符串转换为 Date 或 LocalDateTime 等对象&#xff0c;然后使用适当的注解或配置来确保它们以正确的格式序…...

LabVIEW橡胶动态特性测试系统

本文介绍了一个利用LabVIEW软件和NI高速数据采集设备构建的橡胶动态特性测试系统。该系统实现了橡胶材料动态性能的精确测量&#xff0c;并通过虚拟仪器技术&#xff0c;提高了测试数据的处理效率和准确性。系统支持实时数据处理和多种信号的动态分析&#xff0c;适用于工业和科…...

deepseek-r1 本地部署

deepseek 最近太火了 1&#xff1a;环境 win10 cpu 6c 内存 16G 2: 部署 1>首先下载ollama 官网&#xff1a;https://ollama.com ollama 安装在c盘 模型可以配置下载到其他盘 OLLAMA_MODELS D:\Ollama 2>下载模型并运行 ollama run deepseek-r1:<标签> 1.5b 7b 8…...

28. 【.NET 8 实战--孢子记账--从单体到微服务】--简易报表--报表定时器与报表数据修正

这篇文章是《.NET 8 实战–孢子记账–从单体到微服务》系列专栏的《单体应用》专栏的最后一片和开发有关的文章。在这片文章中我们一起来实现一个数据统计的功能&#xff1a;报表数据汇总。这个功能为用户查看月度、年度、季度报表提供数据支持。 一、需求 数据统计方面&…...

具身智能技术趋势

参考&#xff1a; 【北京大学-董豪】具身智能技术趋势分析 2024.8 回答了具身智能技术G3、G4的必要性&#xff0c;以及真实数据、仿真数据、互联网数据之间的关系 具身智能趋势 趋势&#xff1a;寻求一个通用路径实现所有的上肢操作 要求&#xff1a;① 低成本 ② 拓展到所有…...

JavaScript逆向高阶指南:突破基础,掌握核心逆向技术

JavaScript逆向高阶指南&#xff1a;突破基础&#xff0c;掌握核心逆向技术 JavaScript逆向工程是Web开发者和安全分析师的核心竞争力。无论是解析混淆代码、分析压缩脚本&#xff0c;还是逆向Web应用架构&#xff0c;掌握高阶逆向技术都将助您深入理解复杂JavaScript逻辑。本…...

C#面试常考随笔6:ArrayList和 List的主要区别?

在 C# 中&#xff0c;ArrayList和List<T>&#xff08;泛型列表&#xff09;都可用于存储一组对象。推荐优先使用List<T>&#xff0c;因为它具有更好的类型安全性、性能和语法简洁性&#xff0c;并且提供了更丰富的功能。只有在需要与旧代码兼容或存储不同类型对象的…...

【数据结构】 并查集 + 路径压缩与按秩合并 python

目录 前言模板朴素实现路径压缩按秩合并按树高为秩按节点数为秩 总结 前言 并查集的基本实现通常使用森林来表示不同的集合&#xff0c;每个集合用一棵树表示&#xff0c;树的每个节点有一个指向其父节点的指针。 如果一个节点是它自己的父节点&#xff0c;那么它就是该集合的代…...

使用 Redis List 和 Pub/Sub 实现简单的消息队列

使用 Redis List 和 Pub/Sub 实现简单的消息队列 Redis 本身不是专门的消息队列系统&#xff0c;但它提供了多种数据结构&#xff08;如 List、Pub/Sub、Stream&#xff09;来实现消息队列功能。根据不同的业务需求&#xff0c;可以选择不同的方式&#xff1a; 在 Redis 中&a…...

aerodrome交易所读合约分析

池地址 0xb2cc224c1c9fee385f8ad6a55b4d94e92359dc59token0 0x4200000000000000000000000000000000000006token1 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913tickSpacing 100stakedLiquidity 4579376109215388530 snapshotCumulativesInside tickLower tickUpperslot0 …...

mybatis(112/134)

多对一 第一种方法&#xff1a; 一的表参数设置&#xff1a; <association property"clazz" javaType"Clazz"> <id property"cid" column"cid"/> <result property"cname" column"cname"/> <…...

Node.js与MySQL模块结合:打造安全高效的用户信息管理系统

摘要 本文探讨使用Node.js构建前端项目并导入MySQL模块创建数据库连接对象的方法。文中讲解了共享数据库连接对象&#xff0c;定义SQL语句查询和更新用户信息&#xff08;排除密码字段以保护隐私&#xff09;&#xff0c;以及根据用户ID更新基本信息、重置密码和更新头像的具体…...

【C++】设计模式详解:单例模式

文章目录 Ⅰ. 设计一个类&#xff0c;不允许被拷贝Ⅱ. 请设计一个类&#xff0c;只能在堆上创建对象Ⅲ. 请设计一个类&#xff0c;只能在栈上创建对象Ⅳ. 请设计一个类&#xff0c;不能被继承Ⅴ. 请设计一个类&#xff0c;只能创建一个对象&#xff08;单例模式&#xff09;&am…...

在ubuntu下一键安装 Open WebUI

该脚本用于自动化安装 Open WebUI&#xff0c;并支持以下功能&#xff1a; 可选跳过 Ollama 安装&#xff1a;通过 --no-ollama 参数跳过 Ollama 的安装。自动清理旧目录&#xff1a;如果安装目录 (~/open-webui) 已存在&#xff0c;脚本会自动删除旧目录并重新安装。完整的依…...