Linux(十二)信号
今天我们就要来一起学习信号啦!!!还记得小编在之前的文章中说过的ctrl+c吗?之前小编没有详细介绍过,现在我们就要来学习啦!!!
一、信号的基本介绍
首先,小编带领大家先一起学习一下什么是信号吧。
信号是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作;
大家要注意,我们在使用信号时,是需要添加头文件的。与信号有关的系统调用在<signal.h>头文件中。
1、信号的存储位置
旧版
vim /usr/include/x86_64-linux-gnu/bits/signum.h
新版(23版)
vim /usr/include/x86_64-linux-gnu/bits/signum-arch.h
vim /usr/include/x86_64-linux-gnu/bits/signum-generic.h
2、常见信号对应的功能
SIGBORT *进程异常终止
SIGALRM 超时警告
SIGFPE *浮点运算异常
SIGHUP 连接挂断
SIGILL *非法指令
SIGINT 终端中断
SIGKILL 终止进程(此信号不能被捕获或忽略)
SIGPIPE 向无读进程的管道写数据
SIGQUIT 终端退出
SIGSEGV *无效内存段访问
SIGTERM 终止
SIGUSR1 用户定义信号1
SIGUSR2 用户定义信号2
(在这里,重点的信号用了加粗提醒大家一定要记住,在这篇文章里,小编还不会向大家介绍SIGPIPE,在后面小编介绍管道时,会结合前边的内容和新的内容全面介绍管道)
3、信号的值
信号名称 信号代号
#define SIGHUP 1
#define SIGINT 2 //键盘按下 Ctrl+c 时,会产生终端中断信号
#define SIGQUIT 3 //键盘按下 Ctrl+\时,会产生终端退出信号
#define SIGILL 4
#define SIGTRAP 5
#define SIGABRT 6
#define SIGIOT 6
#define SIGBUS 7
#define SIGFPE 8
#define SIGKILL 9 //该信号的响应方式不允许改变
#define SIGUSR1 10
#define SIGSEGV 11
#define SIGUSR2 12
#define SIGPIPE 13 //读端关闭的描述符,写端写入时产生,该信号会终止程序(向无读进程的管道写数据)
#define SIGALRM 14
#define SIGTERM 15 //系统 kill 命令默认发送的信号
#define SIGSTKFLT 16
#define SIGCHLD 17 //子进程结束后,内核会默认给父进程发送该信号
#define SIGCONT 18
#define SIGSTOP 19
#define SIGSTP 20
#define SIGTTIN 21
#define SIGTTOU 22
#define SIGURG 23
(通过这个,小编是想告诉大家,这些信号其实对应的就是数字)
二、信号的响应方式
信号有三种响应方式:默认、忽略、自定义;
1、信号处理函数
在Linux系统中,我们想要了解一个新的知识必不可少的就是帮助手册啦!!!大家还记得怎么使用吗?
答案就是:man signal
2、 三种响应方式
(1)默认
如果signal函数的参数为 SIG_DFL
,则系统将使用默认的信号处理动作。
大家可以输入命令“man 7 signal”查看默认处理方式,当然啦,小编也会为大家展示出来。
在上图,小编只截取了刚刚加粗的几个信号,想看完整的小伙伴可以自己输入命令“man 7 signal”,往下翻就能看到啦。
(2)忽略
如果signal函数的参数为 SIG_IGN
,则系统将忽略该信号。
(3)自定义
信号自定义处理,其实是对信号进行捕捉,然后让信号执行自定义的方法。
下面,小编向大家演示一下默认的处理方式(也就是收到信号后,进程按照信号默认的方式去处理)
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<signal.h>
int main()
{while(1){printf("main run\n");sleep(1);} exit(0);
}
在上述代码中,小编写了一个while(1)的循环,会一直执行, 当我们键盘按下ctrl+c时,其实就是因为该进程收到了一个信号:SIGNT——终端中断的信号(2号信号);就是说,在键盘上按下ctrl+c时,会给当前终端前台执行的进程发送SIGINT信号;
3、改变型号的响应方式
(1)将默认改为自定义
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<signal.h>
#include<string.h>
void sig_fun(int sig)
{printf("sig=%d\n",sig);
}
int main()
{signal(SIGINT,sig_fun);//这里不是调用,这里是作约定while(1){printf("main run\n");sleep(1);} exit(0);
}
那我们该如何结束进程呢?
方法一(图上方法):我们可以通过ctrl+\这个是终端退出的信号
方法二:打开另外一个终端,通过ps -eflgrep test[test是程序名,可替换]这个命令找到该进程的pid,然后kill掉它。(这也是我们在前面学习kill时掌握的方法)
(2)将默认改为忽略
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<signal.h>
#include<string.h>
int main()
{signal(SIGINT,SIG_IGN);//这里不是调用,这里是作约定while(1){ printf("main run\n");sleep(1);} exit(0);
}
4、SIGCHLD信号
(1)子进程结束,父进程会收到内核发送的SIGCHLD信号(注意:内核发送)
大家还记得我们在学习fork复制进程中的父子进程时用到的代码吗?
小编把代码放到这里帮助大家回顾昂
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>int main(){char *s=NULL;int n=0;pid_t id=fork();if(pid==-1){printf("fork err\n");exit(1);}if(id == 0){s="child";n=3;}//子进程else{s="parent";n=7;}//父进程int i=0;for(;i<n;i++){printf("s=%s\n",s);sleep(1);}exit(0);
}
在学习僵死进程时,小编说过父进程没有获取退出码是会产生僵死进程的;
在上面这段代码里,其实子进程结束了,已经给父进程发送了一个信号.只不过父进程忽略了;那么,我们修改一下代码,让父进程收到子进程的代码,打印一下收到的信号代号,不要忽略掉;
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>void sig_fun(int sig)
{printf("sig = %d\n",sig);printf("child over!\n");
}
int main()
{int n=0;char *s = NULL;pid_t pid=fork();if(pid == -1) { printf("fork err\n");exit(1);} if(pid==0){ n=3;s="child";} else{ signal(SIGCHLD,sig_fun);//子进程结束,内核会默认给父进程发送信号n=7;s="parent";}for(int i =0;i<n;i++){printf("s=%s\n",s);sleep(1);}exit(0);
}
由执行结果可以看出,子进程结束,确实是会给父进程发送17号信号SIGCHLD;只不过遇到默认情况,父进程不会理会而已;所以,这个17号信号的默认方式就是忽略;
再次强调一下,这个不是子进程发送的信号,是内核发送的信号;
大家还记得处理僵死进程的两种方法嘛
(1)父进程先结束(2)父进程调用wait()方法获取子进程的退出码
两个方法的本质是一样的,但是方法二会阻塞,就是父进程在等子进程结束,才会获取退出
码。结合信号,如何处理,让它不再阻塞呢?
父进程调用wait是配合信号使用的。让我们通过下面的代码观察一下吧!
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<wait.h>//注意,wait的头文件不要忘记void sig_fun(int sig)
{printf("sig = %d\n",sig);printf("child over!\n");int val;wait(&val);//我们也可以简单写,就是不获取退出码,只要不变成僵死进程就可以//wait(NULL);
}
int main()
{int n=0;char *s = NULL;pid_t pid=fork();if(pid == -1) { printf("fork err\n");exit(1);} if(pid==0){ n=3;s="child";}else{signal(SIGCHLD,sig_fun);//子进程结束,内核会默认给父进程发送信号n=7;s="parent";}for(int i =0;i<n;i++){printf("s=%s\n",s);sleep(1);}exit(0);
}
三、信号实例练习
1、收到SIGINT这个信号,第一次打印信号的代号,第二次按照默认形式把进程结束
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<string.h>
#include<signal.h>
void sig_fun(int sig)
{printf("sig = %d\n",sig);signal(sig,SIG_DFL);
}
int main(){signal(SIGINT,sig_fun);//这里不是调用,这里是作约定while(1){ printf("main run\n");sleep(1);} exit(0);
}
2、自己实现kill命令
(1)系统调用kill与kill命令
kill也是一个命令,它底层就封装了我们的系统调用kill;
所以,man kill是1命令,man 2 kill才是系统调用;
man 2 kill得到原型:
int kill(pid_t pid,int sig);
就是向PID为pid的发送sig信号;
返回值为-1说明失败,0表示成功.
(2)回顾kill命令
执行kill PID命令,这个就是系统调用,默认发送了15号信号。比如我们sleep 500,然后
打开另外一个终端kill掉它,这个kill就是默认发送了15号信号。
(3)实现kill命令
自己实现kill命令,需要PID,需要信号代号。就是我们也要写一个类似kill-9 PID 的命令;为什么需要信号代号呢?
9号信号是一个特殊的信号,它是不允许改变响应方式的。
比如暂停进程(ctrl+Z),那么kill不掉,就需要9号信号强制结束。
写一个类似kill-9 PID的命令;(./mykill PID SIG)
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<signal.h>//./mykill pid 信号代号
int main(int argc,char *argv[])
{if(argc!=3){printf("argc error!\n");return -1; } int pid = 0;int sig = 0;sscanf(argv[1],"%d",&pid);sscanf(argv[2],"%d",&sig);if(kill(pid,sig)==-1){ perror("kill error!\n");//perror是打印出错信息,输出错误原因} exit(0);
}
(4)15号信号和9号信号
运行sleep 500这个进程,发现使用自己的mykill命令发送15号信号显示的是“已终止(Terminated)",发现使用自己的mykill命令发送9号信号是“已杀死(killed)",和系统的kill命令是一样的。
那可能有小伙伴就会说kill命令没有传递信号代号,其实是一样的,也就是mykill传递两个参数即可,把信号代号也就是argv[2]定义成15,或者9即可。
在这里小编想补充一下,其实19号信号也不能被忽略,它是暂停进程。
【小编有话说】
本次内容就要结束啦,截止到这篇文章,小编其实已经带领大家自己写了两个命令了,分别是mycp和mykill,还有小伙伴记得嘛,mycp是在读写操作那里实现的。小编现在正在筹备一个关于LINUX项目的文章,大概可能会再过两篇Linux文章就会发布啦,到时后希望小伙伴们能够多多捧场呀!!!
最后还是老三样,点赞收藏和关注~
喜欢小编的文章就不要忘记这三样,点赞收藏加关注,找到小编不迷路~
相关文章:
Linux(十二)信号
今天我们就要来一起学习信号啦!!!还记得小编在之前的文章中说过的ctrlc吗?之前小编没有详细介绍过,现在我们就要来学习啦!!! 一、信号的基本介绍 首先,小编带领大家先一…...
迪杰斯特拉+二分+优先队列+拓扑+堆优化(奶牛航线Cowroute、架设电话线dd、路障Roadblocks、奶牛交通Traffic)
原文地址 https://fmcraft.top/index.php/Programming/2025040402.html 主要算法 迪杰斯特拉Dijkstra 题目列表 P1:奶牛航线Cowroute 题目描述 题目描述 Bessie已经厌倦了农场冬天的寒冷气候,她决定坐飞机去更温暖的地方去度假。不幸的是…...
【数据结构】树的介绍
目录 一、树1.1什么是树?1.2 树的概念与结构1.3树的相关术语1.4 树形结构实际运用场景 二、二叉树2.1 概念与结构2.2 特殊的二叉树2.2.1 满二叉树2.2.2 完全二叉树 个人主页,点击这里~ 数据结构专栏,点击这里~ 一、树 1.1什么是树࿱…...
【CF】Day24——Codeforces Round 994 (Div. 2) D
D. Shift Esc 题目: 思路: 典DP的变种 如果这一题没有这个变换操作,那么是一个很典型的二维dp,每一个格子我们都选择上面和左边中的最小值即可 而这题由于可以变换,那我们就要考虑变换操作,首先一个显然…...
Python 字典
Python 字典 字典的介绍 字典不仅可以保存值,还能对值进行描述使用大括号来表示一个字典,不仅有值 value ,还有值的描述 key字典里的数据都是以键值对 key-value 的形式来保留的key 和 value 之间用冒号 : 来连接多个键值对之间用逗号 , 来…...
yolov12检测 聚类轨迹运动速度
目录 分割算法api版: 分割算法: yolo_kmean.py 优化版: 第1步,检测生成json 第2步骤聚类: 分割算法api版: import json import os from glob import globimport cv2 import imageio import numpy as np from scipy.ndimage import gaussian_filter1d from scipy.s…...
【Lua】pcall使用详解
目录 基本语法核心作用基础示例示例 1:捕获一个简单错误示例 2:调用不存在的函数 高级用法1. 传递多个参数和接收多个返回值2. 捕获带 error 主动抛出的错误3. 匿名函数与 pcall 使用场景注意事项总结 在 Lua 中,pcall(Protected …...
Floyd 算法 Java
图论算法实践:使用 Floyd 求任意两点最短路(Java 实现) 在图论算法中,Floyd-Warshall 算法是一个经典的动态规划算法,用于在一个加权图中寻找所有点对之间的最短路径。 场景描述 假设我们有一个包含 n 个点的无向图&…...
List结构之非实时榜单实战
像京东、淘宝等电商系统一般都会有热销的商品榜单,比如热销手机榜单,热销电脑榜单,这些都是非实时的榜单。为什么是非实时的呢?因为完全实时的计算和排序对于资源消耗较大,尤其是当涉及大量交易数据时。 一般来说&…...
OCR的备份与恢复
1.简介 在Oracle RAC环境中,ASM(Automatic Storage Management)管理的OCR(Oracle Cluster Registry)是集群的关键组件,存储集群配置和状态信息。 OCR的备份一般指物理备份,系统默认每4个小时自…...
算法思想之双指针(一)
欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之双指针(一) 发布时间:2025.4.4 隶属专栏:算法 目录 双指针算法介绍对撞指针:快慢指针: 例题移动零题目链接题目描述算法思路代码实现 复写零题目链接题目描…...
Pascal语言的设备管理
Pascal语言的设备管理 引言 在计算机科学中,设备管理是操作系统的重要组成部分之一。设备管理指的是操作系统对外部设备的控制和协调,实现对各种设备的有效利用。Pascal语言作为一种教育性编程语言,虽然最初并不是为了直接进行设备管理而设…...
【MySQL】DML:添加-修改-删除数据 (数据操作语言) 学习笔记
DML (数据操作语言) 学习笔记 1. 数据表结构 首先创建员工表 employee: CREATE TABLE employee (id int unsigned NOT NULL AUTO_INCREMENT COMMENT ID,username varchar(20) NOT NULL COMMENT 用户名,password varchar(32) DEFAULT 123456 COMMENT 密码,name va…...
React编程高级主题:背压(Backpressure)处理
文章目录 **5.1 背压(Backpressure)概述****5.1.1 缓冲(Buffer)****1. 基本概念****2. 缓冲的实现方式****3. 适用场景****4. 潜在问题** **5.1.2 丢弃(Drop)****1. 基本概念****2. 丢弃的实现方式****3. 适…...
Spring IoCDI
IoC容器 前⾯我们提到IoC控制反转, 就是将对象的控制权交给Spring的IOC容器 ,由IOC容器创建及管理对 象。 也就是bean的存储. 在类上⾯添加 RestController 和 Controller 注解, 就是把这个对象交给Spring管理 , Spring 框架启动时就会加载该类. 把对象…...
COBOL语言的数据库交互
COBOL语言的数据库交互 引言 随着信息技术的不断发展,数据库管理系统(DBMS)已经成为现代应用程序中不可或缺的组成部分。在众多编程语言中,COBOL(Common Business-Oriented Language)以其在商业应用中的稳…...
【C++11(中)】—— 我与C++的不解之缘(三十一)
一、可变参数模版 基本语法: C11支持可变参数模版,简单来说就是支持可变数量参数的函数模版或者类模版; 可变数目的参数被称为参数包,存在两种参数包:模版参数包(表示0个或者多个模版参数),函数参数包(表示…...
JavaScript学习19-事件类型之鼠标事件
1. 2. 3....
文件或目录损坏且无法读取:数据恢复的实战指南
在数字化时代,数据的重要性不言而喻。然而,在日常使用电脑、移动硬盘、U盘等存储设备时,我们难免会遇到“文件或目录损坏且无法读取”的提示。这一提示如同晴天霹雳,让无数用户心急如焚,尤其是当这些文件中存储着重要的…...
python爬虫:小程序逆向实战教程
根据我之前发表的文章,我们进行延伸实战https://blog.csdn.net/weixin_64809364/article/details/146981598?spm1001.2014.3001.5501 1. 想要爬取什么小程序,我们进行搜索 2. 找到我们vx小程序的文件地址,我们就可以进行破解 破解步骤强看…...
第二十节课:python实例五:身体质量指数BMI计算
python实例五:身体质量指数BMI计算 一、问题分析 BMI计算公式: BMI 体重(kg) / 身高(m)^2国际与国内标准对比 分类国际标准国内标准偏瘦<18.5<18.5正常18.5-2518.5-24偏胖25-3024-28肥胖≥30≥28 二、实现要点 输入处理 # 同时接收身高体重…...
八、重学C++—动态多态(运行期)
上一章节: 七、重学C—静态多态(编译期)-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146999362?spm1001.2014.3001.5502 本章节代码: cpp/dynamicPolymorphic.cpp CuiQingCheng/cppstudy - 码云 - 开源中…...
思维链 Chain-of-Thought(COT)
思维链 Chain-of-Thought(COT):思维链的启蒙 3. 思维链 Chain-of-Thought(COT)存在问题?2. 思维链 Chain-of-Thought(COT)是思路是什么?1. 什么是 思维链 Chain-of-Thoug…...
React框架的Fiber架构
以下是关于 Fiber 架构 的系统梳理: 一、Fiber 架构的出现背景 React 15 及之前的问题 同步递归渲染:虚拟DOM的diff过程不可中断,导致主线程长时间阻塞。掉帧问题:复杂组件树渲染时,用户交互无法及时响应。无法实现增量渲染:无法拆分任务优先级,无法利用浏览器空闲时间。…...
PCI与PCIe接口的通信架构是主从模式吗?
PCI(Peripheral Component Interconnect)总线在通信架构上本质是主从模式,但其具体实现和角色分配在不同版本(如传统PCI与PCI Express)中存在差异。以下是详细分析: 传统PCI总线的主从模式 (1) 基本架构 主…...
【2011】【论文笔记】THz保护文化遗产——
前言 类型 太赫兹 + 文化保护 太赫兹 + 文化保护 太赫兹+文化保护 期刊 I E E E T R A N S A C T I O N S O N T E R A H E R...
状态机思想编程练习
状态机实现LED流水灯 本次实验,我们将利用状态机的思想来进行Verilog编程实现一个LED流水灯,并通过Modelsim来进行模拟仿真,再到DE2-115开发板上进行验证。 首先进行主要代码的编写。 module led (input sys_clk,input sys_…...
三部门新政力推智能家居 居然智家数智化转型迎利好东风
2025年3月,工业和信息化部、教育部、市场监管总局联合印发《轻工业数字化转型实施方案》,明确提出重点培育智能家居、智能穿戴、智能骑行、智慧养老等消费端场景,深化人工智能技术在家电、家具等领域的应用,推动产业链供应链智能化…...
CCF GESP C++编程 七级认证真题 2025年3月
C 七级 2025 年 03 月 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 B A B C B B B A D D A C B B D 一、单选题 第 1 题 下列哪个选项是C中的关键字? A. function B. class C. method D. object 第 2 题 下面代码输出的是() int main()…...
【MySQL】navicat16 result字段识别不了
在mysql里面使用result字段 打印出来为空 之后换了个字段命名 使用outcome 成功能打印出来了。。 不知道是不是版本的问题...
【教学类-102-02】自制剪纸图案(留白边、沿线剪)02——Python+PS自动化添加虚线边框
背景需求: 01版本实现了对透明背景png图案边界线的扩展,黑线实线描边 【教学类-102-01】自制剪纸图案(留白边、沿线剪)01-CSDN博客文章浏览阅读974次,点赞15次,收藏7次。【教学类-102-01】自制剪纸图案(留白边、沿线剪)01https://blog.csdn.net/reasonsummer/article…...
CExercise_05_1函数_1.1素数(要对键盘录入的数据做参数校验)
题目: 编写函数实现以下功能: 键盘录入一个正整数,请判断它是否是一个素数,然后控制台输出对应的结果。要对键盘录入的数据做参数校验,素数是一个大于1的自然数,它仅能被1和自身整除。 关键点 分析…...
运算放大器(五)电压比较器
比较器在最常用的简单集成电路中排名第二,仅次于排名第一的运算放大器。 电压比较器是一种用来比较输入信号电压与参考电压大小,并将比较结果以高电平或低电平形式输出的一种信号处理电路,广泛应用于各种非正弦波的产生和变换电路中…...
蓝桥杯_PCF8591
目录 一 前言 二 引言 三 PCF8591介绍 (1)I2C通信 (2)原理图中的8591 四 代码层面 (1)根据题目所给的示范代码,实现ADC 1 为什么需要返回值,同时返回值是unsigned char&#x…...
Windows修改hosts文件让向日癸软件联网
Windows修改hosts文件让向日癸软件联网 前言一、查看向日葵软件使用的网址及IP1.清除dns记录2.打开向日葵软件并将dns记录导出txt 二、修改Windows服务器的hosts文件1.winx选择Windows PowerShell(管理员)2.在Windows PowerShell中输入如下内容:3.在hosts文件最后添…...
[MySQL初阶]MySQL数据类型
MySQL数据类型 1. 数据类型分类2. 数值类型2.1 tinyint类型2.2 bit类型2.3 float类型2.4 decimal类型3. 字符串类型3.1 char3.2 varchar3.3 日期和时间类型3.4 enum和set1. 数据类型分类 数据库中的类型决定了在存储位置中,占据的空间大小以及如何识别的问题。 2. 数值类型 2…...
JS用ES6和ES5分别实现:8字节长整数和字节数组的互转
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
【学Rust写CAD】29 Alpha256结构体(alpha256.rs)
源码 #[derive(Clone, Copy)] pub struct Alpha256(u32);impl Alpha256{#[inline]pub fn from(alpha:u32)->Alpha256{Alpha256(alpha1)}// Calculates 256 - (value * alpha256) / 255 in range [0,256],// for [0,255] value and [0,256] alpha256.#[inline]fn alpha_mul_…...
Titanic - Machine Learning from Disaster
数据集 通过网盘分享的文件: 链接: https://pan.baidu.com/s/17TLeF8PW2GSWTbAIJC69-A?pwd4dak 提取码: 4dak 准备工作 # 导入必要的库 import numpy as np # 用于数值计算(如矩阵运算、数学函数等) import pandas as pd # 用于数据…...
GoFrame框架中Prometheus Metric组件监控的优势与实践
文章摘要 GoFrame 是一款轻量、高效且模块化的 Go 语言全能型框架,在 Go 生态中以其企业级应用能力和简洁设计受到开发者青睐。随着微服务架构的普及,性能监控成为开发中不可或缺的一环,而 Prometheus 凭借其强大的时间序列数据处理能力和灵…...
SQL语言的物联网
以SQL语言的物联网 引言 物联网(IoT,Internet of Things)作为一个新兴的技术领域,正迅速改变着我们的生活方式和工作模式。它通过将各种物体连接到互联网,实现了设备之间的智能通信与数据交换。随着物联网的普及&…...
戴尔笔记本 ubuntu 22.04 开机后进入initramfs界面
问题 在 Ubuntu 22.04 启动时进入 initramfs 界面,并提示 Gave up waiting for root device. Common problems: - Boot args (cat /proc/cmdline)- Check rootdelay (did the system wait long enough?) - Missing modules (cat /proc/modules; ls /dev) ALERT! …...
JavaScript BOM、事件循环
目录 BOM(浏览器对象模型) 一、window 对象 1. 窗口控制 2. 定时器 二、location 对象 三、navigator 对象 四、history 对象 五、screen 对象 六、本地存储 1. localStorage 2. sessionStorage 七、BOM 应用场景 八、总结 JavaScript 执行…...
归并排序算啊模板and三道困难级别的归并力扣算法题--LCR170,493,315
目录 归并排序算法模板: 1.1题目链接:LCR.170.交易逆序对的总数 1.2题目描述: 1.3解法(利用归并排序的过程--分治): 2.1题目链接:315.计算右侧小于当前元素的个数 2.2题目描述: 2.3解法: …...
鸿蒙 harmonyOS:项目实战 :倒计时器
代码: import { promptAction } from kit.ArkUIEntry Component struct Index {State count: number 10 // 初始倒计时秒数State timerId: number -1 // 定时器ID// 开始倒计时startCountdown() {if (this.timerId -1) {this.timerId setInterval(() > {if …...
31--当认证协议开始“选秀“:RADIUS、LDAP、AD与本地认证的C位之争
当认证协议开始"选秀":RADIUS、LDAP、AD与本地认证的C位之争 引言:认证界的"四大天王" 如果把企业网络比作夜店,那么身份认证就是门口的黑衣保安。不同风格的保安队长各有绝活: RADIUS像特种兵出身的安检专家…...
AI 数理逻辑基础之统计学基本原理(上)
目录 文章目录 目录统计学统计学基本概念描述性统计数据可视化图表工具 汇总统计统计数据的分布情况:中位数、众数、平均值统计数据的离散程度:极差、方差、标准差、离散系数 相关分析Pearson 线性关系相关系数Spearman 单调关系相关系数 回归分析回归模…...
C++容器数据类型定义、测试用例
C11 标准库提供了多种容器类型,每种容器定义了多个成员类型(如 value_type、iterator 等),用于与容器交互。以下详细说明各容器的数据类型定义、测试用例及注意事项。 一、顺序容器 1. std::vector<T> 类型定义࿱…...
bun 版本管理工具 bum 安装与使用
在使用 node 的过程中,我们可能会因为版本更新或者不同项目的要求而频繁切换 node 版本,或者是希望使用更简单的方式安装不同版本的 node,这个时候我们一般会用到 nvm 或者类似的工具。 在我尝试使用 bun 的时候,安装前第一个想到…...
AI——使用numpy
文章目录 一、numpy的介绍1、ndarray介绍2、ndarray使用1、ndarray的属性2、ndarray生成数组的方法 3、修改数组的形状4、修改数组的类型5、数组去重 二、数组的运算1、逻辑运算2、通用判断函数3、三元运算符4、统计运算 三、数组间运算四、数学:矩阵 一、numpy的介…...