【C语言】信号
【C语言】信号
- 信号
- 1. 信号状态
- 2. 信号处理方式
- 3. 信号注册相关函数
- 4. 信号集相关函数
信号
1. 信号状态
信号有三种状态:产生、未决和递达
信号产生方式:
- 按键产生,ctrl+c 产生 中断信号SIGINT,ctrl + \ 产生退出信号 SIGQUIT并生成core文件,ctrl +z产生停止信号SIGSTOP
- 系统调用,例如kill、raise、abort函数
- 定时器
- 发生异常
信号未决状态:
是指信号在阻塞信号集中被设置为阻塞,那么接收到这个信号后,会被保存到进程的未决信号集中,当阻塞解除才能执行对应信号处理函数。
信号递达状态:
进程接收到信号并执行了对应操作。
2. 信号处理方式
- 执行默认的操作
- 忽略
- 捕获,执行用户定义的处理函数
信号无法排队,所以如果同时来了很多信号,那么需要用循环进行处理
查看当前系统有哪些信号 kill -l
,其中 SIGKILL 和 SIGSTOP 不能被捕捉,阻塞,或忽略。
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS
3. 信号注册相关函数
//signal()
//用于注册信号捕捉函数,当捕获对应信号时,执行相应函数。
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
参数signum: 信号handler: 信号处理函数//sigaction()
//用于注册信号捕捉函数,执行相应函数,并且添加处理方式,返回0成功,返回-1失败
#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: 传入参数,新的信号处理方式sa_handler:信号处理函数,还可赋值为SIG_IGN表示忽略信号到来 或 SIG_DFL表执行默认动作sa_sigaction:如果在 sa_flags 中指定了 SA_SIGINFO ,则 sa_sigaction(而不是SA_handler)作为signum的信号处理函数。此函数接收的信号号作为其第一个参数,一个指向 siginfo_t 类型的指针作为其第二个参数,这个类型结构体包含了很多和进程相关的信息,以及一个指向ucontext_t类型(强制转换为void*)的指针作为第三个参数。(通常,处理程序函数不使用第三个参数。),通常设置为NULLsa_mask:信号处理时需要阻塞的信号掩码sa_flags:通常为0,表示使用默认标识sa_restorer:不应用于应用程序,已舍弃oldact :传出参数,旧的信号处理方式同上//kill()
//用于向某个进程发信号。
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
参数pid 进程idsig 信号//raise()
//用于自己给自己发送信号
#include <signal.h>
int raise(int sig);
返回值成功返回0失败返回非0//abort()
//用于自己给自己发送 SIGABRT 信号,等价于 abort() == kill(getpid(), SIGABRT);
#include <stdlib.h>
void abort(void);//alarm()
//设置时钟seconds秒数,内核会给当前进程发送 SIGALRM 信号,每个进程只有一个定时器
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
返回值返回0或者剩余秒数
//取消定时器使用alarm(0),返回旧闹钟余下秒数,不管进程处于什么状态,计时器一直计时//setitimer()
//也是设置计时器,比alarm函数计时得更精确,可以精确到微秒。子进程不会继承父进程的计时器
#include <sys/time.h>
int getitimer(int which, struct itimerval *curr_value);
int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value);struct itimerval {struct timeval it_interval; /* Interval for periodic timer */计时周期时间struct timeval it_value; /* Time until next expiration */第一次计时时间,可通过getitimer函数获取该值得到剩余计时时间
};struct timeval {time_t tv_sec; /* seconds */suseconds_t tv_usec; /* microseconds */
};
//成功返回0,失败返回-1
参数which: 指定定时方式ITIMER_REAL 计算实时时间,给当前进程发送 SIGALRM 信号ITIMER_VIRTUAL 计算进程运行时间,发送 SIGVTALRM 信号ITIMER_PROF 计算进程运行时间和系统调用时间,这个通常和ITIMER_VIRTUAL组合进行评测进程运行时间和系统调用时间,发送 SIGPROF 信号。getitimer 中 curr_value 是传出参数,表示剩余时间。
setitimer 中 new_value 设置计时时间old_value 通常设置为NULL,如果非NULL,那么是一个传出参数,返回的是原来的计时器。
示例:
创建三个子进程,子进程结束时会给父进程发送 SIGCHLD 信号,父进程执行对应函数回收子进程。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>void sighandle(int signo)
{pid_t pid;while (1){pid = waitpid(-1, NULL, WNOHANG);if (pid > 0){printf("child [%d] is over\n", pid);}else if (pid == 0){printf("no more child need clean");break;}else if (pid == -1){printf("no child is living, pid==[%d]\n", pid);break;}else{perror("waitpid error");break;}}
}int main()
{int i = 0;pid_t pid;signal(SIGCHLD, sighandle);for (i = 0; i < 3; i++){pid = fork();if (pid < 0){perror("fork error");return -1;}else if (pid > 0){// father}else{// childprintf("here is child [%d],father is [%d]\n", getpid(), getppid());break;}}if (i==3){while (1){sleep(1);}}return 0;
}
进程实际执行时间 = 系统时间 + 用户时间 + 损耗时间
损耗的时间主要来来自文件IO操作,IO操作会有用户区到内核区的切换,切换的次数越多越耗时。
4. 信号集相关函数
信号集有阻塞信号集和未决信号集,当某些信号在阻塞信号集中被设置为阻塞,那么当这个信号来时,该进程的未决信号集会将该信号对应设置为未决信号。只有解除该信号为非阻塞,才会执行对应的信号处理函数。
#include <signal.h>
//初始化信号集,清空所有信号
int sigemptyset(sigset_t *set);
//初始化信号集,包含所有信号
int sigfillset(sigset_t *set);
//添加信号进入到某个信号集
int sigaddset(sigset_t *set, int signum);
//从信号集中删除某个信号
int sigdelset(sigset_t *set, int signum);
//上面都是返回0成功,返回-1失败
//判断信号是否在这个信号集中,返回 1在,0不在,-1错误
int sigismember(const sigset_t *set, int signum);//sigpending()
//获取当前进程的未决信号集,set为传出参数,
int sigpending(sigset_t *set);//sigprocmask()
//用来修改进程pcb中阻塞信号集中的内容,成功返回0,失败返回-1
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
参数how:将后面的set进行某种操作SIG_BLOCK :将set添加到阻塞信号集SIG_UNBLOCK :将set从阻塞信号集移除SIG_SETMASK :直接将set作为阻塞信号集set: 信号集,可以使用上面的一系列函数得到oldset: 通常设为NULL,否则返回之前的阻塞信号集
示例:
创建三个子进程,并且屏蔽SIGINT中断信号,然后注册SIGCHLD信号处理函数,注册时阻塞SIGCHLD信号
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>void sighandle(int signo)
{pid_t pid;while (1){pid = waitpid(-1, NULL, WNOHANG);if (pid > 0){printf("child [%d] is over\n", pid);}else if (pid == 0){printf("no more child need clean\n");break;}else if (pid == -1){printf("no child is living, pid==[%d]\n", pid);break;}else{perror("waitpid error");break;}}
}int main()
{int i = 0;pid_t pid;char usig = SIGINT;// signal(SIGCHLD, sighandle);sigset_t set;sigset_t oldset;int ret = sigemptyset(&set);if (ret < 0){perror("sigemptyset error");return -1;}ret = sigaddset(&set, usig);if (ret < 0){perror("sigaddset error");return -1;}ret = sigismember(&set, usig);if (ret < 0){perror("sigaddset error");return -1;}else if (ret == 0){printf("error:usig not in set\n");return -1;}else if (ret == 1){printf("usig in set\n");}//添加信号SIGINT到阻塞信号集ret = sigprocmask(SIG_BLOCK, &set, &oldset);if (ret < 0){perror("sigprocmask error");return -1;}for (i = 0; i < 3; i++){pid = fork();if (pid < 0){perror("fork error");return -1;}else if (pid > 0){// father}else{// childprintf("here is child [%d],father is [%d]\n", getpid(), getppid());break;}}if (i == 3){//注册捕捉函数struct sigaction act;memset(&act, 0x00, sizeof(act));ret = sigemptyset(&act.sa_mask);ret = sigaddset(&act.sa_mask, SIGCHLD);act.sa_handler = sighandle;act.sa_flags = 0;ret = sigaction(SIGCHLD, &act, NULL);if (ret < 0){perror("sigaction error");return -1;}printf("here is father last words\n");while (1){}}return 0;
}//输出
usig in set
here is father last words
here is child [2751],father is [2750]
child [2751] is over
no more child need clean
here is child [2752],father is [2750]
child [2752] is over
no more child need clean
here is child [2753],father is [2750]
child [2753] is over
no child is living, pid==[-1]
示例:
使用定时器,定时发送计时结束信号SIGALRM
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/time.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>void sighandle(int signo)
{printf("signo is [%d]\n", signo);
}int main()
{// alarm(3);// int getitimer(int which, struct itimerval *curr_value);// int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value);struct itimerval time;struct itimerval lasttimer;memset(&time,0x00,sizeof(time));memset(&time,0x00,sizeof(lasttimer));time.it_interval.tv_sec = 3;time.it_interval.tv_usec = 0;time.it_value.tv_sec = 1;time.it_value.tv_usec = 0;setitimer(ITIMER_REAL, &time, NULL);int ret;// 注册捕捉函数struct sigaction act;memset(&act, 0x00, sizeof(act));ret = sigemptyset(&act.sa_mask);// 信号处理的时候阻塞SIGALRM信号ret = sigaddset(&act.sa_mask, SIGALRM);act.sa_handler = sighandle;act.sa_flags = 0;ret = sigaction(SIGALRM, &act, NULL);while (1){sleep(1);getitimer(ITIMER_REAL,&lasttimer);printf("[%ld:%ld]\n",lasttimer.it_value.tv_sec,lasttimer.it_value.tv_usec);}return 0;
}
//输出
signo is [14]
[2:978958]
[1:955765]
[0:950218]
signo is [14]
[2:995498]
[1:984102]
[0:970387]
signo is [14]
[2:978756]
[1:964049]
[0:915772]
signo is [14]
...
相关文章:
【C语言】信号
【C语言】信号 信号1. 信号状态2. 信号处理方式3. 信号注册相关函数4. 信号集相关函数 信号 1. 信号状态 信号有三种状态:产生、未决和递达 信号产生方式: 按键产生,ctrlc 产生 中断信号SIGINT,ctrl \ 产生退出信号 SIGQUIT并…...
2023年下半年软考信息安全工程师案例分析及答案解析
试题一(16分) 回答问题1至问题6,将解答填入答题纸对应的解答栏内。 问题1(4分) 已知DES算法S盒如下,请补全S盒空缺的数据(1)、(2)、(3)、(4)。 【参考答案】3、13、15、0 问题2(2分) 已知S盒的输入为110011,请计算经过S盒变换之后的二进制输出。 【参考…...
攻防世界easyphp
<?php highlight_file(__FILE__); $key1 0; $key2 0;$a $_GET[a]; $b $_GET[b];if(isset($a) && intval($a) > 6000000 && strlen($a) < 3){if(isset($b) && 8b184b substr(md5($b),-6,6)){$key1 1;}else{die("Emmm...再想想&quo…...
【WRF教程第3.6期】预处理系统 WPS 详解:以4.5版本为例
预处理系统 WPS 详解:以4.5版本为例 Geogrid/Metgrid 插值选项详解1. 插值方法的工作机制2. 插值方法的详细说明2.1 四点双线性插值(four_pt)2.2 十六点重叠抛物线插值(sixteen_pt)2.3 简单四点平均插值(av…...
图解HTTP-HTTP协议
HTTP HTTP是一种不保存状态,即无状态的协议。HTTP协议自身不对请求和响应之间的通信进行保存。为了保存状态因此后面也有一些技术产生比如Cookies技术。 HTTP是通过URI定位网上的资源,理论上将URI可以访问互联网上的任意资源。 如果不是访问特定的资源…...
Linux基本命令
Linux基本命令 一条Linux命令由:命令本身 [可选项] [参数] ls 展示 ls命令的选项: -a 选项,可以展示出隐藏的内容 以 . 开头的文件或文件夹默认被隐藏,需要-a才能显示出来 **-l **选项,以列表的形式展示内容,并展示更多细节-h 选项&…...
【win10+RAGFlow+Ollama】搭建本地大模型助手(教程+源码)
一、RAGFlow简介 RAGFlow是一个基于对文档深入理解的开源RAG(Retrieval-augmented Generation,检索增强生成)引擎。 主要作用: 让用户创建自有知识库,根据设定的参数对知识库中的文件进行切块处理,用户向大…...
.ejs 后缀文件 - 嵌入式JavaScript模板
嵌入式JavaScript模板(Embedded JavaScript templates)文件是以.ejs 后缀。它是一种模板引擎,它允许你在你的HTML文件中直接嵌入JavaScript代码。EJS模板可以包含HTML代码、JavaScript表达式、控制结构(如if语句和循环)…...
springboot461学生成绩分析和弱项辅助系统设计(论文+源码)_kaic
摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装学生成绩分析和弱项辅助系统软件来发挥其高效地信息处理的作…...
【从零开始入门unity游戏开发之——C#篇23】C#面向对象继承——`as`类型转化和`is`类型检查、向上转型和向下转型、里氏替换原则(LSP)
文章目录 一、as类型转化和is类型检查1、as 关键字使用场景:语法:示例:特点: 2、is 关键字使用场景:语法:示例:特点: 3、总结 二、向上转型和向下转型1、向上转型示例: 2…...
“魔法糖果盒的秘密:用朴素贝叶斯算法猜糖果颜色”
想象一下,你有一个神奇的糖果盒,这个糖果盒里有两种糖果:红色的和蓝色的。你闭上眼睛,从盒子里拿出一个糖果,然后尝一尝,你想知道这个糖果是红色的还是蓝色的。朴素贝叶斯算法就像是一个魔法规则࿰…...
使用“NodeMCU”、“红外模块”实现空调控制
项目思路 空调遥控器之所以能够实现对空调的控制,是因为它能够向空调发射出特定的红外信号。从理论上来说,任何能够发射出这种相同红外信号的红外发射器,都可以充当空调遥控器(这也正是手机能够控制多种不同品牌空调的原因所在&a…...
了解cuda的统一内存
1. CUDA 6中的统一内存 在CUDA 6中,从Kepler GPU架构(计算能力3.0或更高)开始,在64位Windows 7、8和Linux操作系统(内核2.6.18)上开始支持统一内存. 从CUDA 6开始,NVIDIA推出了CUDA平台历史上…...
MySQL索引
2.1 索引概述 2.1.1 介绍 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就…...
会话控制(cookie、session 和 token)
1. 介绍 所谓会话控制就是 对会话进行控制HTTP 是一种无状态的协议,它没有办法区分多次的请求是否来自于同一个客户端, 无法区分用户,而产品中又大量存在的这样的需求,所以我们需要通过 会话控制 来解决该问题。 常见的会话控制…...
stm32 rtc 详解
目录 L151 RTC 唤醒代码 方式一 通过 RTC Alarm Interrupt:(基本和F1系列一样): L151 RTC 唤醒代码 方式二 通过 RTC WakeUp Interrupt F103VE RTC 闹钟唤醒代码 (103RC 没有闹钟中断): RTC(real time…...
D 咖智能饮品机器人:开启商业新篇
在科技迅猛发展的当下,智能机器人正逐步渗透到各个商业领域,D 咖智能饮品机器人便是其中的佼佼者,它的出现为饮品行业带来全新的发展契机,有望开启商业新篇。 从大环境来看,消费者对于饮品的需求日益多元化和个性化。他…...
使用FakeSMTP创建本地SMTP服务器接收邮件具体实现。
以下代码来自Let’s Go further节选。具体说明均为作者本人理解。 编辑邮件模版 主要包含三个template: subject:主题plainBody: 纯文本正文htmlBody:超文本语言正文 {{define "subject"}}Welcome to Greenlight!{{end}} {{def…...
重拾设计模式--模板方法模式
文章目录 一、模板方法模式概述二、模板方法模式UML图三、优点1代码复用性高2可维护性好3扩展性强 四、缺点五、使用场景六、C 代码示例1七、 C 代码示例2 一、模板方法模式概述 定义:定义一个操作中的算法骨架,而降一些步骤延迟到子类中。模板方法使得…...
二、windows环境下vscode使用wsl教程
本篇文件介绍了在windows系统使用vscode如何连接使用wsl,方便wsl在vscode进行开发。 1、插件安装 双击桌面vscode,按快捷键CtrlShiftX打开插件市场,搜索【WSL】点击安装即可。 2、开启WSL的linux子系统 点击左下方图标【Open a Remote Win…...
我们的电视Our tv 3.6.0安卓+TV 一款全新电视直播软件-内置稳定直播源
应用简介 我们的电视(ourtv)是一款完全无广告的电视直播软件,清晰度可选择高清,超清,蓝光等播放。安装即可使用,再也不用费劲去找各种不稳定的直播源了。 “我们的电视”播放线路(直播源&…...
批处理理解
初识批处理 如何批处理: 命名:.bat 方法:创建一个记事本文件,然后将其扩展改为.bat 批处理作用:自上而下成批处理每一条DOS命令,直到执行到最后一条。运行环境:当然是我们cmd了 回归我学过的…...
高效准确的PDF解析工具,赋能企业非结构化数据治理
目录 准确性高:还原复杂版面元素 使用便捷:灵活适配场景 贴心服务:快速响应机制 在数据为王的时代浪潮中,企业数据治理已成为组织优化运营、提高竞争力的关键。随着数字化进程的加速,企业所积累的数据量呈爆炸式增长…...
Go框架比较:goframe、beego、iris和gin
由于工作需要,这些年来也接触了不少的开发框架,Golang的开发框架比较多,不过基本都是Web"框架"为主。这里稍微打了个引号,因为大部分"框架"从设计和功能定位上来讲,充其量都只能算是一个组件&…...
【ETCD】【实操篇(三)】【ETCDCTL】如何向集群中写入数据
在分布式系统中,etcd 是一个高可用的键值存储,用于存储和共享配置信息、服务发现、协调等。向 etcd 写入数据可以通过多种方式进行,常见的方式是使用 etcd 提供的 HTTP API 或者通过客户端库来进行操作。 目录 一、使用EtcdCtl工具来写入数据…...
2025年春节档的《哪吒2》,光线传媒动画梦的关键一战
没想到《哪吒之魔童闹海》会以这种形式重回大众视野。 距离2025年春节还有不到两个月,春节档电影大战已经打响,原本市场还在猜测2024年频频“胎动”的《哪吒之魔童闹海》(以下简称《哪吒2》)会不会参与这场“神仙打架”ÿ…...
windows C#-实例构造函数
声明一个实例构造函数,以指定在使用 new 表达式创建某个类型的新实例时所执行的代码。 要初始化静态类或非静态类中的静态变量,可以定义静态构造函数。 如以下示例所示,可以在一种类型中声明多个实例构造函数: class Coords {pu…...
FPGA-PS端编程1:
目标 在小梅哥的zynq 7015上,完成以下目标: 读取 S1 按键的电平, 当 S1 按键为按下状态时,驱动 PS LED 以 1S 的频率闪烁(注意理解 1S 的频率闪烁和 1S的时间翻转两种描述之间的差别), 当 S1 释放后,停止…...
【JavaEE进阶】第一个Spring Boot程序
目录 🌴安装插件 🎄Spring Boot介绍 🌳Spring Boot项目创建 🚩创建Spring Boot项目 🏀jar 包下载不下来问题 🚩启动项目 🌲目录介绍 🚩src文件 🚩target文件 &…...
RunCam WiFiLink连接手机图传测试
RunCam WiFiLink中文手册从这里下载 一、摄像头端 1.连接天线(易忘) 2.打开摄像头前面的盖子(易忘) 3.接上直流电源,红线为正,黑线为负 4.直流电源设置电压为14v,电流为3.15A, 通…...
使用Chat-LangChain模块创建一个与用户交流的机器人
当然!要使用Chat-LangChain模块创建一个与用户交流的机器人,你需要安装并配置一些Python库。以下是一个基本的步骤指南和示例代码,帮助你快速上手。 安装依赖库 首先,你需要安装langchain库,它是一个高级框架&#x…...
地级市2011-2020数字经济 博士研究生自用数据
赵涛评价指标数据,具体指标见图片 参考文献: [1]赵涛,张智,梁上坤.数字经济、创业活跃度与高质量发展——来自中国城市的经验证据[J].管理世界,2020,36(10):65-76. 每百人移动电话数,是模仿赵涛的,指人均再➗100 数据来源,中国城…...
呼叫中心部门如何使用开源大模型智能呼叫中心,对接已有系统实现降本增效
呼叫中心部门如何使用开源大模型智能呼叫中心,对接已有系统实现降本增效 作者:开源大模型智能呼叫中心FreeIPCC 随着人工智能技术的快速发展,特别是大规模语言模型(LLM)的应用,企业可以通过将开源大模型与…...
Latex 转换为 Word(使用GrindEQ )(英文转中文,毕业论文)
效果预览 第一步: 告诉chatgpt: 将latex格式中的英文翻译为中文(符号和公式不要动),给出latex格式第二步: Latex 转换为 Word(使用GrindEQ ) 视频 https://www.bilibili.com/video/BV1f242…...
多态中虚函数调用问题
在多态中,一般通过虚函数表会调用子类重写的虚函数,然而,有一种情况调用的还是父类的虚函数,就是在父类的构造函数中调用的是父类的虚函数,无论子类是否重写。 #include <iostream> #include <list> #inc…...
【NLP 18、新词发现和TF·IDF】
目录 一、新词发现 1.新词发现的衡量标准 ① 内部稳固 ② 外部多变 2.示例 ① 初始化类 NewWordDetect ② 加载语料信息,并进行统计 ③ 统计指定长度的词频及其左右邻居字符词频 ④ 计算熵 ⑤ 计算左右熵 编辑 ⑥ 统计词长总数 ⑦ 计算互信息 ⑧ 计算每个词…...
windows服务器Oracle TNS 远程监听器中毒
修复Oracle TNS 监听器远程中毒漏洞 1.1 修改监听文件 如何快速找到listener.ora ? cmd输入 tnsping localhost 修改配置文件,路径以自己的实际路径为准,我都在D盘 listener.ora内容如下: #listener.ora Network Configuration F…...
GitLab的安装和使用
1.GitLab 环境说明 系统版本 CentOS 7.2 x86_64 软件版本 gitlab-ce-10.8.4 GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能…...
常用的JVM启动参数有哪些?
大家好,我是锋哥。今天分享关于【常用的JVM启动参数有哪些?】面试题。希望对大家有帮助; 常用的JVM启动参数有哪些? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JVM启动参数用于配置Java虚拟机(JVM)的运行时行为…...
MobaXterm 连接不上VMware 的Ubuntu 虚拟机
想在window11的笔记本上通过VMWare安装Ubuntu操作系统,但是在两个桌面见来回切换,十分的麻烦,于是通过远程服务访问客户端软件MateXterm来访问虚拟机的Linux系统,但是从CSDN上搜到的教程都没有成功,于是,尝…...
异步BUCK二极管损耗计算
异步BUCK工作原理 Q闭合时(Ton),输入电压Vin为电感L和输出电容Cout充电,同时为负载供电;Q断开时(Toff),电感L为负载供电,电流通过续流二极管D回流到电感L; 之…...
【WPF】把DockPanel的内容生成图像
要在WPF中将一个 DockPanel 的内容生成为图像并保存,可以按照与之前类似的步骤进行,但这次我们将专注于 DockPanel 控件而不是整个窗口。 DockPanel的使用 WPF(Windows Presentation Foundation)中的 DockPanel 是一种布局控件&…...
STM32定时器对象捕获功能测量市电频率
在很多嵌入式系统中,精确地测量外部信号的频率是一个常见需求,尤其是对于需要同步外部电源(如市电)的应用。市电频率(50Hz或60Hz)是电力系统中一个至关重要的参数。在许多场景下,特别是UPS&…...
[react]5、React脚手架
1、前端脚手架 1、Vue的脚手架:vue-cli 2、Angular的脚手架:angular-cli 3、React的脚手架:create-react-app 目前这些脚手架都是使用node编写的,并且都是基于webpack的,需要在电脑上安装node环境 脚手架的作用是帮助我…...
uni-app开发个人中心页面
目录 一:功能实现 二:功能实现 一:功能实现 个人中心主要展示用户的个人信息,订单信息以及其他模块信息包含收藏,我的地址,我的钱包等。页面分为三个部分,底部显示用户信息和个人设置等。中间部分显示订单信息可以点击查看订单列表,底部显示其他模块信息。 二:功…...
Ubuntu 20.04 卸载和安装 MySQL8.0
卸载 首先,检查一下系统安装的软件包有哪些,使用dpkg -l | grep mysql命令: 为了将MySQL卸载干净,这些文件都需要被删除。 在Ubuntu20.04系统下,卸载干净MySQL8.0以确保下一次安装不会出错,可以按照以下…...
【深度学习-论文】通俗易懂的理解多标签识别
文章目录 1. 文章主要内容2. 通俗易懂的理解多标签分类到底是如何实现的通俗易懂的多标签分类实现介绍实现步骤为什么这么做?小结论文题目:Rada r emitter multi-la bel recognition based on residual network 基于残差网络的雷达发射机多标签识别1. 文章主要内容 《基于残…...
“TA”说|表数据备份还原:SQLark 百灵连接助力项目部署验收
💬 南飞雁|应用开发工程师 有些重要项目的部署验收,会在生产环境完成,验收完成后,又需要把这部分数据清空。这时就需要对数据表进行备份和还原,虽然可以通过命令直接实现,但是有一些操作门槛&am…...
android studio方便快捷保存数据读取数据(SharedPreferences)
原理:会自动生成一个xml文件,然后保存参数。xml文件的名字就是要读取的文件的名字。可以创建多个这样的xml文件。(储存方式是键值对方式,一个名字 对应 一个值) 首先先创建两个对象 private SharedPreferences shar…...
31.设计模式
单例模式 比如工具类,进需要一个实例,即可以在各处处理。用以节省创建类对象的开销和内存的开销。 保证一个类只有一个实例,而客户可以从一个众所周知的访问点访问它。 实现一个简单的单例 在一个python文件中定义一个类,并创…...