【Linux系统编程】:信号(2)——信号的产生
1.前言
我们会讲解五种信号产生的方式:
- 通过终端按键产生信号,比如键盘上的Ctrl+C。
- kill命令。本质上是调用kill()
- 调用函数接口产生信号
- 硬件异常产生信号
- 软件条件产生信号
前两种在前一篇文章中做了介绍,本文介绍下面三种.
2. 调用函数产生信号
2.1 kill()
sig是信号编码,pid是捕获信号的进程pid。
我们编写一个程序proc.c,
#include <stdio.h>
#include <unistd.h>int main()
{while(1){printf("I am a process, pid: %d\n", getpid());sleep(1);}
}
利用mykill中的kill()杀掉它,
#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
using namespace std;
//argv*[]:mykill pid signal
int main(int argc, char const *argv[])
{if(argc != 3){cout << "usage: ./mykill signal pid" << endl;//告诉用户用法exit(1);}int signo= atoi(argv[1]);int pid = atoi(argv[2]);int ret = kill(pid, signo);if(ret == -1){perror("kill");exit(2);}//kill函数返回值:成功返回0,失败返回-1return 0;
}
2.2 raise()
raise(sig)是对kill(getpid(),sig)的封装。
2.3 abort()
我们编写代码来测试一下abort函数,
#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
using namespace std;void myhandler(int signo)
{cout << "process get a signal: " << signo <<endl;// exit(1);
}
int main(int argc, char *argv[])
{ int cnt = 0;while (true){cout << "I am a process, pid: " << getpid() << endl;sleep(1);cnt++;if(cnt % 2 == 0) {abort();}}
}
重新编译并运行,
我们怎么确定abort()调用的是6号信号呢?我们可以捕捉6号信号,修改代码为:
//头文件等略
void myhandler(int signo)
{cout << "process get a signal: " << signo <<endl;
}
int main(int argc, char *argv[])
{ signal(SIGABRT, myhandler);int cnt = 0;while (true){cout << "I am a process, pid: " << getpid() << endl;sleep(1);cnt++;if(cnt % 2 == 0) {abort();}}
}
SIGABRT确实被捕获到了,可为什么最后还是调用了abort()呢?不是应该一直循环下去吗?
我们将abort()注释掉,换成“kill(getpid(), 6);”,
重新编译运行,
发现程序没有推掉,说明abort()虽然是对SIGABORT的封装,但后面还增加了自己的细节,致使所在进程退出,而SIGABORT不会终止进程,它表示程序出现异常。
3. 硬件异常产生信号
3.1 “除0代码”
我们编写一段“除0代码”
#include <iostream>
#include <unistd.h>using namespace std;int main()
{ cout << "div before" << endl;sleep(5);int a = 10;a /= 0;//异常cout << "div after" << endl;sleep(1);return 0;
}
编译运行,
输入指令“man 7 signal”,查阅信号对应的注释,
找到注释对应的信号SIGFPE,
是8号信号中断了该进程。我们尝试捕获*号信号,
#include <iostream>
#include <unistd.h>
#include <signal.h>using namespace std;void handler(int signo)
{sleep(1);cout << "catch signal" << signo << endl;
}
int main()
{ signal(SIGFPE,handler);cout << "div before" << endl;sleep(5);int a = 10;a /= 0;//异常cout << "div after" << endl;sleep(1);return 0;
}
重新编译运行,并监视
我们发现,当SIGFPE被捕获后,进程不会退出,并且一直执行“自定义行为”(也就是一直打印)。
3.2 “野指针代码”
我们编写一段“野指针代码”,
#include <iostream>
#include <unistd.h>
#include <signal.h>
using namespace std;
int main()
{ cout << "point error before" << endl;sleep(3);int *p = nullptr;*p = 10;cout << "point error after" << endl;sleep(1);return 0;
}
段错误是11号信号,也就是内存错误,
我们捕捉该信号,
#include <iostream>
#include <unistd.h>
#include <signal.h>
using namespace std;
void handler(int signo)
{cout << "catch signal:" << signo << endl;sleep(1);
}
int main()
{ signal(SIGSEGV,handler);cout << "point error before" << endl;sleep(3);int *p = nullptr;*p = 10;cout << "point error after" << endl;sleep(1);return 0;
}
同样,11号信号被捕捉后,段错误异常就不会终止进程。
所以程序出现异常,进程不一定会被终止,当然,这是因为我们自定义了进程接收到信号后的处理行为。所以一般情况下,进程出现异常了,都会终止。
3.3 为什么“除0、野指针”会让进程终止呢?
这是因为操作系统遇到“除0、野指针”问题,会发送信号给进程,进程处理信号会终止自己。这也说明,不论产生信号的方式是什么,最终都是由操作系统发送信号给进程。
但这不是关键,关键是操作系统怎么知道代码中的“除0、野指针”问题,
-
对于除0错误:当CPU从上到下执行程序的代码时,如果遇到了除0,CPU中的状态寄存器的溢出标志位就会由0变为1,操作系统就知道CPU当前调度的进程出现了异常(操作系统是硬件的管理者)。注意:寄存器信息是进程的上下文,进程之间是独立的,所以上个进程的溢出标识符为1,并不会影响到下一个进程,更不会让操作系统出错。
总结:除0问题会被转换成硬件问题,表现在硬件上,从而被操纵系统识别到,操作系统就会处理该问题,该问题并不会影响到操作系统的稳定性,只会影响到当前进程(异常的进程)。
那么我们捕获信号后为什么程序会一直打印而不崩溃呢?
这是因为问题一直没有被修复,当进程被调度进CPU,状态寄存器"出错",操作系统向当前进程发送信号,进程执行信号打印,打印完后上下文中的错误又没被修复,进程还一直在调度运行中,状态寄存器一直”出错“,操作系统一直发送信号,所以程序一直打印。
那么捕捉信号不修正问题,为什么还要有“自定义信号处理”的方法呢?
自定义信号捕捉是为了让用户知道程序为什么崩溃,便于打印日志,以及保存崩溃前的信息。而不是为了让用户直接解决当前的进程异常问题。 -
对于“野指针”问题,是因为虚拟地址无法经过页表转换为物理内存地址(可能溢出或者没有访问权限),而页表是由MMU维护的,MMU会发送对应的信号被操作系统识别。
4.软件条件产生异常
处理硬件可能产生异常,软件也可能产生异常。比如我们在匿名管道一章讲解的管道四大特征之一:当管道的写端被关闭后,读端的进程会自动退出。这是13号信号SIGPIPE造成的。
软件运行中,可能会出现一些特殊事项,致使软件的一些条件没有被满足,就可能产生异常。
我们拿alarm()举例,
4.1 alarm
alarm()
函数是 Unix 和类 Unix 系统编程中的一个标准函数,它用于设置一个定时器,当定时器到达指定时间后,会向进程发送一个 SIGALRM
信号。这个函数通常用于实现定时任务或超时处理。
函数原型
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
参数
seconds
:定时器的秒数。如果设置为 0,则会关闭之前设置的定时器。
返回值
- 返回值是之前定时器剩余的时间(秒),也就是前一个闹钟要响起的剩余时间,防止多个闹钟在同一时间响起。如果之前没有设置定时器,则返回 0。
使用示例
以下是一个简单的 C 程序示例,演示如何使用 alarm()
函数:
#include <iostream>
#include <unistd.h>
using namespace std;int main()
{ int n = alarm(5);//设置一个5秒的闹钟while(1){cout << "the proc is running" << endl;sleep(1);}return 0;
}
我们在查一下信号表,
这样我们还不确信,可以捕获该信号测试一下,
#include <iostream>
#include <unistd.h>
#include <signal.h>
using namespace std;
void handler(int signo)
{cout << "catch a signal,the number:" << signo << endl;sleep(1);
}
int main()
{ int n = alarm(5);//设置一个5秒的闹钟signal(SIGALRM,handler);while(1){cout << "the proc is running" << endl;sleep(1);}}
这个闹钟为什么只响一次呢?我们之前的“野指针”和“除0”都不断的打印自定义行为,这个却打印一次,因为闹钟不是异常。
如果我们要让闹钟每隔5秒打印一次,可以在handler()修改为,
void handler(int signo)
{cout << "catch a signal,the number:" << signo << endl;alarm(5);
}
我们利用这个原理,可以让进程每隔一段时间执行特定的工作,比如打印日志。
void work()
{cout << "print log..." << endl;
}
void handler(int signo)
{work();cout << "catch a signal,the number:" << signo << endl;alarm(5);
}
注意事项
alarm()
只能设置以秒为单位的定时器,如果需要更精确的时间控制,可以考虑使用setitimer()
或timer_create()
等函数。alarm()
设置的定时器是单次的,如果需要重复触发,需要在信号处理函数中再次调用alarm()
。- 在多线程程序中使用
alarm()
时要特别小心,因为它是针对整个进程的,可能会影响其他线程的行为。
5. Core dump
SIGINT的默认处理动作是终止进程,SIGQUIT的默认处理动作是终止进程并且Core Dump,Core Dump是什么意思呢?
我们在进程等待中也提到过Core Dump,
我们编写一段父进程回收子进程的代码,分别用8号信号和2号信号终止子进程,获取子进程的core dump标志,
2号信号和8号信号杀死进程的core dump标志确实不一样,那么这个表示到底是什么意思呢?
由于云服务器一般把core file文件的大小设为0(相当于关闭了core dump的功能),或者操作系统重新配置了core文件生成的目录,所以我们用ll查看当前目录,不会看到相关文件,我们可以用ulimit -a查看系统资源的限制信息,其中就包括core文件的大小,然后用“ulimit -c 10240",将core file 的大小设置为10240K,
然后重新运行程序,再用8号信号杀死,此时如果还看不到相关的core文件,可在命令行输入“sudo bash -c "echo core.%p > /proc/sys/kernel/core_pattern”,core文件不存在的原因
重新编译再杀死进程,就有对应的core文件了。
所以,一旦打开了系统的core dump功能,某个进程因异常而被Action为core的信号终止时,操作系统就会将进程在内存中的运行信息,dump(转储)到进程的工作目录下(磁盘中),形成core.pid文件。
那么core.pid文件有什么用呢?
该文件保存了程序中断的原因,可以帮助我们更好的识别、修改bug。
为什么core dump默认是关闭的呢?
在 Linux 系统中,core dump 默认是关闭的,主要原因有以下几点:
- 磁盘空间占用:core dump 文件会包含程序在崩溃时的内存映像,包括代码段、数据段、堆、栈等信息,其大小可能非常大,尤其是对于大型应用程序。如果系统中多个程序频繁崩溃并生成 core dump 文件,会占用大量的磁盘空间,影响系统的正常运行和存储资源的使用效率。
- 性能影响:生成 core dump 文件需要将大量内存数据写入磁盘,这个过程可能会消耗较多的 I/O 资源,导致系统性能下降。对于一些对性能要求较高的系统或应用程序,这种性能损失是不可接受的。
- 安全性考虑:core dump 文件可能包含程序运行时的敏感信息,如用户数据、加密密钥、系统配置等。如果这些文件被未授权的用户访问,可能会导致信息泄露,带来安全隐患。因此,默认关闭 core dump 功能可以在一定程度上保护系统的安全性。
- 管理复杂性:如果系统中所有程序都默认开启 core dump 功能,可能会导致生成大量的 core dump 文件,增加了系统管理员管理和分析这些文件的复杂性。管理员需要定期清理这些文件,以避免磁盘空间被占用,同时还需要对每个文件进行分析,以确定程序崩溃的原因,这会消耗大量的时间和精力。
当然,core dump 文件对于程序开发和故障排查是非常有用的,它可以帮助开发者快速定位程序崩溃的原因,提高程序的稳定性和可靠性。因此,在需要调试程序或分析程序崩溃原因时,可以手动启用 core dump 功能,并根据实际情况设置合适的文件大小限制和保存路径。
来源:https://kimi.moonshot.cn/chat/
相关文章:
【Linux系统编程】:信号(2)——信号的产生
1.前言 我们会讲解五种信号产生的方式: 通过终端按键产生信号,比如键盘上的CtrlC。kill命令。本质上是调用kill()调用函数接口产生信号硬件异常产生信号软件条件产生信号 前两种在前一篇文章中做了介绍,本文介绍下面三种. 2. 调用函数产生信号 2.1 k…...
Qwen2.5-7B 微调rz吧数据集
Qwen2.5-7B 微调弱智吧数据集 模型微调简介 模型微调是一种在已有预训练模型的基础上,通过使用特定任务的数据集进行进一步训练的技术。这种方法允许模型在保持其在大规模数据集上学到的通用知识的同时,适应特定任务的细微差别。使用微调模型ÿ…...
未来将要被淘汰的编程语言
COBOL - 这是一种非常古老的语言,主要用于大型企业系统和政府机构。随着老一代IT工作人员的退休,COBOL程序员变得越来越少。Fortran - 最初用于科学和工程计算,Fortran在特定领域仍然有其应用,但随着更现代的语言(如Py…...
翻转(蓝桥杯2023大学C组试题E)
【问题描述】:小蓝用黑白棋的n个棋子排成了一行,他在脑海里想象出了一个长度为n的01串T,他发现如果把黑棋当作1、白棋当做0,这一行棋子是一个长度为n的01串S。 小蓝如果在S中发现一颗棋子和它两边的棋子都不一样,可以将…...
期权VIX指数构建与择时应用
芝加哥期权交易 所CBOE的波动率指数VIX 是反映 S&P 500 指数未来 30 天预测期波动率的指标,由于预期波动率多用于表征市场情绪,因此 VIX 也被称为“ 恐慌指数”。 VIX指数计算 VIX 反映了市场情绪和投资者的风险偏好, 对于欧美市场而言…...
Nginx界的天花板-Oracle 中间件OHS 11g服务器环境搭建
环境信息 服务器基本信息 如下表,本次安装总共使用2台服务器,具体信息如下: 服务器IP DNS F5配置 OHS1 172.xx.xx.xx ohs01.xxxxxx.com ohs.xxxxxx.com OHS2 172.xx.xx.xx ohs02.xxxxxx.com 服务器用户角色信息均为:…...
torch.unsqueeze:灵活调整张量维度的利器
在深度学习框架PyTorch中,张量(Tensor)是最基本的数据结构,它类似于NumPy中的数组,但可以在GPU上运行。在日常的深度学习编程中,我们经常需要调整张量的维度以适应不同的操作和层。torch.unsqueeze函数就是…...
为什么使用环形队列
1.看以下两种情况。第一种不会出现问题,当主流程读取次数比较慢时,数据会被覆盖。 2.扩大空间。不可取。 3.什么是队列...
Qt之QML应用程序开发:给应用程序添加图标文件
开发环境: 1、Qt Creator 14.0.1 2、windows10 先看下面的步骤,不明白再返回来看下面官方指导链接。 先看下面的步骤,不明白再返回来看下面官方指导链接。 先看下面的步骤,不明白再返回来看下面官方指导链接。 --------------------------------------------------------…...
基于xiaothink对Wanyv-50M模型进行c-eval评估
使用pypi安装xiaothink: pip install xiaothink1.0.2下载模型: 万语-50M 开始评估(修改模型路径后即可直接开始运行,结果保存在output文件夹里): import os import json import pandas as pd import re from tqdm import tqdm i…...
大模型项目如何成功落地?
随着人工智能的快速发展,大模型已经成为企业转型和提升效率的关键工具。要让大模型成功落地,需要几个关键要素,以及明白如何组建一个高效的团队。 首先,成功的关键在于业务人员的积极参与,这是项目成功的起点。 其次…...
重构(二)
继续"提高代码质量" 接着上文提高代码质量, 需要从这几个特点入手 1、代码重用性。2、可读性。3、可扩展性。4、可靠性。5、高内聚,低耦合。 仅仅就"可读性"去分析一下吧, 毕竟例子实在是太多了 递归的"可读性"不如while循环 递归…...
Sapro编程软件
Sapro软件是由西门子建筑科技公司开发的一款编程软件,主要用于Climatix控制器的编程、调试及相关功能实现.以下是其具体介绍: • 功能强大:可进行HVAC控制编程,实现设备控制、HMI用户访问和设备集成等功能,满足复杂的…...
EasyGBS国标GB28181公网平台P2P远程访问故障诊断:云端服务端排查指南
随着信息技术的飞速发展,视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。EasyGBS平台,作为基于国标GB28181协议的视频流媒体平台,为用户提供了强大的视频监控直播功能。然而,在实际应用中,P2P远程访问可…...
学生管理系统,增加教师管理,班级管理,角色功能权限管理
为了在现有的学生管理系统中增加**教师管理**、**班级管理**以及**角色和权限管理**,我们需要对数据库进行扩展,并相应地更新 Python 代码和用户界面。以下是详细的步骤和代码示例。 ## 1. 数据库扩展 ### 1.1 创建新表 #### 教师表 (teachers) sql …...
Vue CLI 脚手架创建项目流程详解 (2)
更新 CLI 脚手架 确保你安装的是最新版本的 Vue CLI,以支持最新的特性及改进。你可以通过以下命令全局安装或更新 Vue CLI: npm install -g vue/cli创建 Vue 3.x 项目 启动创建向导 使用 vue create 命令来开始创建一个新的 Vue 项目: vue …...
LabVIEW机械故障诊断中的传感器选择
在机械设备故障诊断中,传感器是关键设备,用于采集设备运行状态的各种数据。常见的传感器类型和选择方法如下: 1. 振动传感器 用于检测设备运行中的振动特征,常见于旋转机械和轴承故障诊断。 加速度传感器:检测高频振…...
二叉树_堆
目录 一. 树(非线性结构) 1.1 树的概念与结构 1.2 树的表示 二. 二叉树 2.1 二叉树的概念与结构 2.2 特殊的二叉树 2.3 二叉树的存储结构 三. 实现顺序结构的二叉树 3.1 堆的概念与结构 一. 树(非线性结构) 1.1 树的概念与结构 概念ÿ…...
Java图片拼接
最近遇到一个挺离谱的功能,某个表单只让上传一张图,多图上传会使导出失败。跟开发沟通后表示,这个问题处理不了。我... 遂自己思考,能否以曲线救国的方式拯救一下,即不伤及代码之根本,又能解决燃眉之急。灵…...
使用qemu搭建armv7嵌入式开发环境
目录 目录 1 概述 2 环境准备 2.1 vexpress系列开发板介绍 2.2 安装工具 2.2.1 安装交叉工具链 2.2.2 安装qemu 2.2.3 安装其他工具 3 启动uboot 3.1 uboot下载与编译 3.1.1 下载 3.1.2 编译 3.2 使用qemu启动uboot 4 启动kernel 4.1 下载和编译kernel 4.1.1 下…...
新版国标GB28181设备端Android版EasyGBD支持国标GB28181-2022,支持语音对讲,支持位置上报,开源在Github
经过近3个月的迭代开发,新版本的国标GB28181设备端EasyGBD安卓Android版终于在昨天发布到Github了,最新的EasyGBD支持了国标GB28181-2022版,还支持了语音对讲、位置上报、本地录像等功能,比原有GB28181-2016版的EasyGBD更加高效、…...
Hashtable 描述及源码解析
目录 一、Hashtable的基本概念 二、Hashtable的源码解析 构造函数 哈希算法函数 处理哈希冲突 类定义和成员变量 构造方法 插入元素 查找元素 删除元素 扩容 Hashtable(哈希表)是一种非常重要的数据结构,它提供了快速的数据插入、删…...
clickhouse-数据库引擎
1、数据库引擎和表引擎 数据库引擎默认是Ordinary,在这种数据库下面的表可以是任意类型引擎。 生产环境中常用的表引擎是MergeTree系列,也是官方主推的引擎。 MergeTree是基础引擎,有主键索引、数据分区、数据副本、数据采样、删除和修改等功…...
深度学习之超分辨率算法——SRCNN
网络为基础卷积层 tensorflow 1.14 scipy 1.2.1 numpy 1.16 大概意思就是针对数据,我们先把图片按缩小因子照整数倍进行缩减为小图片,再针对小图片进行插值算法,获得还原后的低分辨率的图片作为标签。 main.py 配置文件 from model im…...
本机如何连接虚拟机MYSQL
要让本机(主机)连接到虚拟机上的 MySQL 数据库,你需要确保虚拟机和主机之间的网络连接正常,并且 MySQL 配置允许外部连接。以下是实现本机连接虚拟机 MySQL 的步骤: 步骤 1:确认虚拟机与本机的网络连接 确…...
mac 安装graalvm
Download GraalVM 上面链接选择jdk的版本 以及系统的环境下载graalvm的tar包 解压tar包 tar -xzf graalvm-jdk-<version>_macos-<architecture>.tar.gz 移入java的文件夹目录 sudo mv graalvm-jdk-<version> /Library/Java/JavaVirtualMachines 设置环境变…...
大模型日报 2024-12-19
大模型日报 2024-12-19 大模型资讯 标题:OpenAI发布季第十天:ChatGPT登陆电话、WhatsApp,你可以给ChatGPT真正打电话了 摘要:OpenAI于2024年12月18日发布了ChatGPT的新功能,用户可以通过电话和WhatsApp与ChatGPT进行互…...
【数据结构练习题】链表与LinkedList
顺序表与链表LinkedList 选择题链表面试题1. 删除链表中等于给定值 val 的所有节点。2. 反转一个单链表。3. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。4. 输入一个链表,输出该链…...
使用 acme.sh 申请域名 SSL/TLS 证书完整指南
使用 acme.sh 申请域名 SSL/TLS 证书完整指南 简介为什么选择 acme.sh 和 ZeroSSL?前置要求安装过程 步骤一:安装 acme.sh步骤二:配置 ZeroSSL 证书申请 方法一:手动 DNS 验证(推荐新手使用)方法二…...
微信小程序开发入门
实现滚动 需要设置高度和边框 轮播图 差值表达式( {{表达式的值}} ),info数据要写到js文件的data数据中 小程序中常用的事件...
【LeetCode】9、回文数
【LeetCode】9、回文数 文章目录 一、数学: 除法和取模1.1 数学: 除法和取模 二、多语言解法 一、数学: 除法和取模 1.1 数学: 除法和取模 例如 15251, offset 也是五位数的 10000 先判断首1和尾1, 再变为 525, offset 变为 100 再判断首5和尾5, 再变为 2, offset 变为 1 整个…...
面试题整理9----谈谈对k8s的理解2
面试题整理9----谈谈对k8s的理解2 1. Service 资源1.1 ServiceClusterIPNodePortLoadBalancerIngressExternalName 1.2 Endpoints1.3 Ingress1.4 EndpointSlice1.5 IngressClass 2. 配置和存储资源2.1 ConfigMap2.2 Secret2.3 PersistentVolume2.4 PersistentVolumeClaim2.5 St…...
fpga系列 HDL:Quartus II PLL (Phase-Locked Loop) IP核 (Quartus II 18.0)
在 Quartus II 中使用 PLL (Phase-Locked Loop) 模块来将输入时钟分频或倍频,并生成多个相位偏移或频率不同的时钟信号: 1. 生成 PLL 模块 在 Quartus II 中: 打开 IP Components。 file:///C:/intelFPGA_lite/18.0/quartus/common/help/w…...
中国量子计算机领域的发展现状与展望
中国量子计算机领域的发展现状与展望 摘要 随着全球科技竞争的加剧,量子计算作为前沿技术领域备受瞩目。中国在量子计算机的研发方面取得了显著进展,本文将深入探讨中国量子计算机领域的现状、取得的成果、面临的挑战以及未来的发展方向,并…...
html(超文本标记语言)
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&…...
如何在Windows系统上安装和配置Maven
Maven是一个强大的构建和项目管理工具,广泛应用于Java项目的自动化构建、依赖管理、项目构建生命周期控制等方面。在Windows系统上安装Maven并配置环境变量,是开发者开始使用Maven的第一步。本文将详细介绍如何在Windows系统上安装和配置Maven࿰…...
基于Python Scrapy的豆瓣Top250电影爬虫程序
Scrapy安装 Python实现一个简单的爬虫程序(爬取图片)_python简单扒图脚本-CSDN博客 创建爬虫项目 创建爬虫项目: scrapy startproject test_spider 创建爬虫程序文件: >cd test_spider\test_spider\spiders >scrapy g…...
mysql,数据库数据备份
mysql 一.数据库备份概念1.备份分类2.备份策略3.备份三要素二.完全备份操作1.物理备份(还原),冷备份2.逻辑备份,温备份三.percona软件的xtrabackup工具备份(2备份,3还原),增量,差异1.percona软件安装2.增量备份(还原)3.差异备份四.binlog日志1.binlog日志概念2.查看binlog日志信…...
模仿elementui的Table,实现思路
vue2子组件使用render,给子子组件插槽传值 和elementui的Table一样使用render 在 Vue 2 中,子组件使用render函数向子子组件插槽传值可以通过以下步骤实现: 1、创建子组件 首先创建一个子组件,在子组件中使用render函数来渲染内容…...
Android Studio AI助手---Gemini
从金丝雀频道下载最新版 Android Studio,以利用所有这些新功能,并继续阅读以了解新增内容。 Gemini 现在可以编写、重构和记录 Android 代码 Gemini 不仅仅是提供指导。它可以编辑您的代码,帮助您快速从原型转向实现,实现常见的…...
大模型+安全实践之春天何时到来?
引子:距《在大模型实践旅途中摸了下上帝的脚指头》一文发布近一年,2024年笔者继续全情投入在大模型+安全上,深度参与了一些应用实践,包括安全大模型首次大规模应用在国家级攻防演习、部分项目的POC直到项目落地,也推动了一些场景安全大模型应用从0到3的孵化上市。这一年也…...
ACL技术---访问控制列表
是一种策略。 对于网络中的流量而言,通常有两种处理方式 允许 拒绝 ACL 的原理 配置了 ACL 的网络设备会根据事先设定好的报文匹配规则对经过该设备的报文进行匹配,然后对报 文执行预先设定好的处理动作。 ACL 的功能 访问控制:在设备…...
第25周:文献阅读
目录 摘要 Abstract 文献阅读 现有问题 提出方法 创新点 方法论 实验研究 数据集 数据预处理 仿真实验 评价指标 实验结果分析 总结 摘要 本篇论文提出了一种基于深度学习框架的风速预测方法——SSA-BiLSTM网络,旨在提高风速预测的精确性。研究使…...
BiTCN-BiGRU基于双向时间卷积网络结合双向门控循环单元的数据多特征分类预测(多输入单输出)
Matlab实现BiTCN-BiGRU基于双向时间卷积网络结合双向门控循环单元的数据多特征分类预测(多输入单输出) 目录 Matlab实现BiTCN-BiGRU基于双向时间卷积网络结合双向门控循环单元的数据多特征分类预测(多输入单输出)分类效果基本描述…...
docker数据卷
什么是数据卷? 在容器中是无法通过vi命令对一个容器中的资源做修改的,这个时候就需要通过数据卷将文件中的内容映射到宿主机,在宿主机修改的文件会更新到容器中,并且容器被删除后不会把数据卷删除,数据卷中的数据会被持…...
Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门任务间的通讯-信号量【入门三】
继续上一篇任务创建 【Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门任务创建【入门二】-CSDN博客】 今天要实现再创建一个任务。【二值和互斥都进行测试】 ①、通过任务A发送一个信号量,另一个任务得到信号量后再发送helloworld。 ②、两个任务通过互斥信…...
使用C#绘制具有平滑阴影颜色的曼德布洛特集分形
示例使用复数类在 C# 中轻松绘制曼德布洛特集分形解释了如何通过迭代方程绘制曼德布洛特集:...
Unittest01|TestCase
一、入门 1、新建测试文件 打开pycharm→左上角新建项目→选择项目路径→选择python解释器→创建→点击新建好的项目,右键新建python文件→测试文件(py文件)命名必须以test开头 2、创建测试用例 定义测试类:导入unittest模块→…...
Django实现异步视图asyncio请求
随着现代Web应用程序对性能和响应速度的需求不断增加,开发者们越来越倾向于采用异步编程来提升应用的效率和用户体验。在传统的Web开发框架中,通常采用同步请求方式,这意味着每一个请求都需要等待前一个请求完成后才能继续处理。对于高并发的请求,可能会出现性能瓶颈。而Dj…...
Apache Samza开源的分布式流处理框架
Apache Samza 是一个开源的分布式流处理框架,用于处理实时数据流和分布式任务。它最初由 LinkedIn 开发,并在 2014 年捐赠给 Apache 软件基金会。Samza 的设计目标是为开发人员提供一个易用、可靠、高效的流处理工具。以下是其关键特点和架构的简介: 核心特点 简单的编程模…...