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

【Linux】信号-上

在这里插入图片描述

欢迎来到Cefler的博客😁
🕌博客主页:折纸花满衣
🏠个人专栏:题目解析
🌎推荐文章:【LeetCode】winter vacation training

在这里插入图片描述


目录

  • 👉🏻信号的概念与产生
    • jobs命令
    • 普通信号和实时信号
    • 如何理解OS向进程发送信号?
  • 👉🏻中断号和中断向量表
  • 👉🏻signal函数
  • 👉🏻信号产生的方式
    • 1.通过终端按键产生信号
    • 2.调用系统函数向进程发信号
    • 3. 由软件条件产生信号
    • 4.硬件异常产生信号
  • 👉🏻哪些信号无法被阻塞

👉🏻信号的概念与产生

信号是一种进程间通信机制,用于向进程发送异步通知(信号什么时候来不确定)。当某个进程接收到一个信号时,它可以选择忽略该信号、继续执行当前操作或者执行与该信号相关的特定操作。

信号是一种向目标进程发送通知消息的一种机制

在Unix/Linux系统中,信号由内核或其他进程产生,并以异步的方式发送给目标进程。常见的信号包括SIGINT(中断信号)、SIGTERM(终止信号)、SIGKILL(强制终止信号)等,每个信号都有一个唯一的编号用于标识该信号。

🍫信号的产生可以分为两种情况:硬件产生的信号和软件产生的信号

硬件产生的信号是由底层硬件设备产生的,如非法内存访问、除以零、总线错误等。当这些错误发生时,操作系统会向受影响的进程发送相应的信号,以通知其发生了错误并可能需要终止程序。

软件产生的信号是由其他进程或系统调用等产生的,如kill指令可以向指定进程发送信号。在使用kill指令时,可以指定不同的信号类型,以达到不同的目的。

总之,信号是一种重要的进程间通信机制,可以用于通知进程发生了特定的事件,需要进行相应的处理。在进程编程中,了解信号的概念和产生方式是非常重要的,可以帮助开发者更好地理解和处理各种异常情况。

jobs命令

在Unix和类Unix系统中,jobs命令用于列出当前终端或shell中正在运行或挂起的作业(job)信息。作业是指由shell启动的一个或多个进程组成的任务,它可以是前台作业(foreground job)或后台作业(background job),也可以是正在运行或者已挂起的作业。

使用jobs命令可以查看当前终端或shell中所有的作业信息,包括作业编号、状态、进程ID等。常见的用法有:

  • jobs:列出当前终端或shell中所有的作业信息。
  • jobs -l:在列出作业信息的基础上,还会显示每个作业的进程ID和进程状态等详细信息。
  • jobs -p:只列出每个作业的进程ID,不显示其他信息。

在jobs命令输出的作业信息中,每个作业都有一个唯一的编号,该编号可以用于对作业进行操作。常用的操作命令有:

  • fg %n:将编号为n的作业切换到前台运行。
  • bg %n:将编号为n的作业切换到后台运行。
  • kill %n:杀死编号为n的作业。

例如,要将编号为3的后台作业切换到前台运行,可以使用fg %3命令;要杀死编号为2的作业,可以使用kill %2命令。

普通信号和实时信号

在 Linux 中,kill -l 命令可以列出所有可用的信号。这些信号可以被用于进程之间的通讯和控制。

信号可以被分为两类:普通信号和实时信号。

普通信号是异步信号,也就是说,信号发送者和接收者不需要同时执行。当一个进程收到一个信号时,它会停止当前操作并处理该信号。常见的普通信号包括:

  • SIGHUP (1):终端挂起或控制进程终止
  • SIGINT (2):来自键盘的中断信号
  • SIGQUIT (3):来自键盘的退出信号
  • SIGILL (4):非法指令
  • SIGABRT (6):异常终止
  • SIGFPE (8):浮点错误
  • SIGKILL (9):强制终止(不能被自定义捕捉)
  • SIGSEGV (11):无效内存引用
  • SIGPIPE (13):管道破裂
  • SIGALRM (14):定时器信号
  • SIGTERM (15):终止信号

实时信号是同步信号,发送和接收都需要同时执行。实时信号可以被用于高精度定时器和进程间同步等场景。常见的实时信号包括:

  • SIGRTMIN (34):实时信号最小值
  • SIGRTMAX (64):实时信号最大值

实时信号的使用相对较少,仅在特定场景下使用。

如何理解OS向进程发送信号?

当操作系统向目标进程发送信号时,它会找到目标进程的进程控制块(Process Control Block,PCB),并更新其中的信号位图。信号位图是一个由比特位组成的数据结构,用于表示进程所接收到的各个信号的状态。

当将信号位图中对应信号的比特位由0置1后,操作系统会等待一个合适的处理时机。一般情况下,这个处理时机是在目标进程执行指令的过程中,也就是在进程的上下文切换点或系统调用返回时。

在进程的函数指针数组中,也称为信号处理表(Signal Handler Table),根据信号编号对应的数组下标,可以找到与该信号相关联的信号处理函数。当操作系统检测到进程接收到一个信号时,它会查找信号处理表,找到对应的处理函数,并执行相关的处理操作。

👉🏻中断号和中断向量表

在计算机系统中,中断是指由硬件或软件发出的一种信号用于暂停正在执行的程序并转而处理某个特定事件或请求。当发生中断时,处理器会停止当前的任务,保存当前的上下文,并跳转到一个称为中断服务例程(ISR,Interrupt Service Routine)或中断处理程序的代码段中去执行相应的操作。

为了管理和区分不同的中断类型,每个中断都会被分配一个唯一的中断号(Interrupt Number)。中断号通常是一个非负整数,用于标识特定的中断类型。

中断向量表(Interrupt Vector Table)是一个存储中断处理程序入口地址的数据结构。它是一个数组或表格,每个表项对应一个中断号,并包含该中断的处理程序的入口地址。当发生中断时,处理器会使用中断号作为索引,从中断向量表中获取相应中断的处理程序入口地址,并跳转到该地址开始执行中断服务例程

中断向量表通常在系统启动时被初始化,并由操作系统或固件维护。每个操作系统或硬件架构可能有不同的中断向量表实现方式和存储位置。

通过中断向量表,系统可以快速地将中断事件分发给相应的中断处理程序,实现对不同中断类型的灵活处理和响应。同时,中断向量表也为开发者提供了一种机制来扩展和自定义中断处理程序,以满足特定的需求。

总之,中断号用于标识不同类型的中断,而中断向量表则用于存储中断处理程序的入口地址。它们是操作系统和硬件实现中重要的概念,用于实现中断机制并提高系统的可靠性和可扩展性。

👉🏻signal函数

signal函数是一个用于处理信号(Signal)的函数,位于C语言的信号处理库signal.h中。它允许程序注册对各种不同信号的处理函数,并在接收到相应信号时执行相应的操作

signal函数的原型如下:

void (*signal(int signum, void (*handler)(int)))(int);

其中,signum表示要处理的信号的编号,而handler是一个指向函数的指针,用于指定信号处理函数。

signal函数的使用方式有三种常见的形式:

  1. 默认处理方式:如果handler参数为SIG_DFL(默认值),则恢复信号的默认处理方式。例如,当进程收到SIGINT信号(通常由Ctrl+C产生)时,会中断当前的操作并退出程序。

    signal(SIGINT, SIG_DFL);
    
  2. 忽略信号:如果handler参数为SIG_IGN,表示忽略该信号。例如,当进程收到SIGTSTP信号(通常由Ctrl+Z产生)时,可以选择忽略该信号而不暂停进程。

    signal(SIGTSTP, SIG_IGN);
    
  3. 自定义信号处理函数:将handler参数设置为一个自定义的信号处理函数,以便在接收到相应信号时执行特定的操作。自定义的信号处理函数应接受一个整数信号编号作为参数,通常使用siginfo_t结构体来获取更多关于信号的信息。

    void handle_signal(int signum) {// 自定义信号处理逻辑
    }signal(SIGUSR1, handle_signal);
    

在 Linux 系统中,Ctrl+Z 和 Ctrl+\ 是两个与终端交互相关的键盘快捷键,而 Ctrl+C 则是与进程控制相关的键盘快捷键。

具体来说:

  • Ctrl+Z:默认情况下,这个快捷键可以将当前正在运行的进程暂停,并将其放入后台。当你输入该快捷键时,系统会向当前正在运行的前台进程发送一个 SIGTSTP 信号,表示要求暂停当前进程。可以使用 fg 命令将该进程恢复到前台继续运行,也可以使用 bg 命令将其转换为后台进程运行。
  • Ctrl+\:这个快捷键可以用于强制终止当前正在运行的进程。当你输入该快捷键时,系统会向当前正在运行的进程发送一个 SIGQUIT 信号,表示要求进程结束运行。如果进程没有处理该信号,它就会被终止并退出。
  • Ctrl+C:这个快捷键可以用于向当前正在运行的进程发送一个中断信号。当你输入该快捷键时,系统会向当前正在运行的前台进程发送一个 SIGINT 信号,表示要求进程终止运行。如果进程没有处理该信号,它就会被终止并退出。

需要注意的是,不同的进程对这些信号的处理方式可能会有所不同。一些进程可能会忽略这些信号,而另一些进程则会捕获并处理它们,以便采取适当的行动或执行清理操作。


当接收到SIGUSR1信号时,程序将执行自定义的信号处理函数来进行一些操作。

#include <stdio.h>
#include <signal.h>// 自定义信号处理函数
void handle_signal(int signum) {printf("Received signal %d\n", signum);// 可以在这里执行其他操作
}int main() {// 注册自定义信号处理函数signal(SIGUSR1, handle_signal);// 模拟一个长时间运行的程序while (1) {// 做一些有意义的工作}return 0;
}

在上面的示例中,我们使用signal函数将SIGUSR1信号与自定义的handle_signal函数关联起来。当程序接收到SIGUSR1信号时,handle_signal函数将被调用,并打印接收到的信号编号。

为了让程序能够响应信号并执行相应的处理函数,通常需要保持程序处于运行状态。在示例中,我们使用一个无限循环来模拟一个长时间运行的程序。实际应用中,可能需要根据具体的需求设计程序的逻辑和退出机制。

👉🏻信号产生的方式

1.通过终端按键产生信号

信号是一种用于进程间通信和进程控制的机制,可以通过多种方式产生。其中一种常见的方式是通过终端按键产生信号。

当你在终端中按下某个特定的组合键时,终端会将这个键盘事件转换为一个信号,并将其发送给前台运行的进程。以下是几个常见的与终端按键相关的信号:

  • SIGINT(中断信号):由 Ctrl+C 产生。当你在终端中按下 Ctrl+C 组合键时,终端会向前台进程发送 SIGINT 信号,通常用于请求进程终止运行。
  • SIGQUIT(退出信号):由 Ctrl+\ 产生。当你在终端中按下 Ctrl+\ 组合键时,终端会向前台进程发送 SIGQUIT 信号,通常用于请求进程终止运行,并且如果进程没有处理该信号,还会生成一个 core dump 文件以供调试使用。
  • SIGTSTP(停止信号):由 Ctrl+Z 产生。当你在终端中按下 Ctrl+Z 组合键时,终端会向前台进程发送 SIGTSTP 信号,通常用于请求暂停当前进程,并将其放入后台运行。

这些信号会被操作系统捕获,并发送给相应的进程。进程可以选择忽略信号、采取默认操作,或者自定义信号处理函数来响应这些信号。通过信号,终端与正在运行的进程之间可以进行交互和控制。


🌎 core dump文件

core dump 文件是一种在程序崩溃或异常终止时生成的二进制文件,用于保存程序在崩溃瞬间的内存映像和其他相关调试信息。它可以为开发人员提供有关程序崩溃原因的重要线索和调试信息。

当一个程序在运行过程中遇到严重错误或异常情况时,操作系统会生成一个 core dump 文件。该文件记录了程序在崩溃瞬间的内存状态寄存器值堆栈信息等数据。这个快照可以帮助开发人员分析问题,定位错误,并进行调试。

core dump 文件通常包含以下信息:

  1. 内存映像:core dump 文件会将程序在崩溃时的内存内容保存下来,包括变量、数据结构、堆和栈的状态等。这些信息可以用于分析程序崩溃时的内存状态。

  2. 寄存器值:core dump 文件还会保存程序崩溃瞬间 CPU 的寄存器值,包括通用寄存器、指令指针和堆栈指针等。这些寄存器值对于确定程序崩溃位置和状态非常重要。

  3. 堆栈跟踪:core dump 文件中包含了程序崩溃时的堆栈跟踪信息,显示了函数调用链和代码路径。这对于定位错误的源头非常有帮助。

使用 core dump 文件,开发人员可以将其加载到调试器中进行分析和调试。调试器可以读取 core dump 文件,并提供各种调试功能,例如查看内存状态、变量值,跟踪函数调用链等。这样开发人员可以更好地理解程序崩溃的原因,并修复问题。

需要注意的是,core dump 文件可能会包含敏感信息,例如密码、私钥等。因此,在共享或发布 core dump 文件之前,应该谨慎处理,确保其中的敏感信息已经被删除或加密。


🌎ulimit命令
ulimit命令是一个用于控制用户进程资源限制的Linux/Unix命令。它可以用来设置和显示不同类型的资源限制,例如打开文件数、核心文件大小、CPU时间等。

ulimit命令的一般语法如下:

ulimit [选项] [参数]

常用的选项包括:

  • -a:显示当前所有资源限制的值。
  • -n:设置或显示最大打开文件数。
  • -c:设置或显示核心文件大小限制。
  • -t:设置或显示CPU时间限制。
  • -f:设置或显示文件大小限制。
  • -u:设置或显示用户进程数限制。

示例:

  1. 显示当前所有资源限制的值:
ulimit -a
  1. 设置最大打开文件数为1024:
ulimit -n 1024
  1. 显示当前核心文件大小限制:
ulimit -c

通过ulimit命令,可以根据需要对不同类型的资源进行限制,以确保系统资源的合理分配和保护。请注意,ulimit命令设置的资源限制只对当前会话有效,并且可能受到系统管理员或其他限制策略的影响。

2.调用系统函数向进程发信号

在Linux/Unix操作系统中,信号是一种进程间通信机制,它可以被用来通知进程发生的事件或异常情况。信号可以由多种方式产生,其中两种常见方式是通过调用系统函数向进程发信号,如kill函数abort函数

  1. kill函数产生信号

kill函数可以向指定进程或进程组发送信号,其原型如下:

int kill(pid_t pid, int sig);

其中,pid参数为要发送信号的进程ID,sig参数为要发送的信号编号。当kill函数成功返回0时,表示信号已经成功发送;当返回-1时,表示发送信号出现了错误。

例如,可以使用以下代码向进程ID为1234的进程发送SIGTERM信号:

kill(1234, SIGTERM);
  1. abort函数产生信号

abort函数会使当前进程产生一个SIGABRT信号,导致进程异常终止。其原型如下:

void abort(void);

当调用abort函数时,会向当前进程发送一个SIGABRT信号,并且该信号的默认处理程序将会执行。在默认处理程序执行之前,如果进程注册了对SIGABRT信号的处理程序,则该处理程序将会被执行。

例如,以下代码将会导致进程异常终止,并向标准错误输出打印一条错误信息:

#include <stdlib.h>
#include <stdio.h>int main() {printf("Before abort()\n");abort();printf("After abort()\n");return 0;
}

除了使用kill函数和abort函数之外,信号也可以由其他方式产生,例如硬件异常、操作系统事件等。对于每种信号,Linux/Unix操作系统都有一些默认的处理程序或行为,可以通过信号处理函数进行修改。

3. 由软件条件产生信号

信号指的是操作系统向进程发送的一种异步消息,通常用于通知进程某种事件的发生,如定时器到期、用户键入中断信号等。在Linux系统中,信号的产生方式有两种:软件条件产生信号和硬件异常产生信号。

软件条件产生信号,通常是基于进程执行过程中的某种条件触发,由进程自身发出。例如在C语言中,可以使用signal函数为进程注册一个信号处理函数,当满足指定的条件时,操作系统就会向进程发送相应的信号

其中,alarm函数就是一种常见的软件条件产生信号的方法。该函数用于设置定时器,当定时器到期时,操作系统会向进程发送SIGALRM信号。下面是一个示例代码:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>void handler(int sig)
{printf("Received SIGALRM signal.\n");
}int main()
{signal(SIGALRM, handler);alarm(5); // 设置定时器,5秒后触发SIGALRM信号sleep(10); // 进程睡眠10秒return 0;
}

在上述代码中,我们首先通过signal函数为进程注册一个信号处理函数handler,并将SIGALRM信号与该处理函数关联起来。接着调用alarm函数设置定时器,让操作系统在5秒后向进程发送SIGALRM信号。最后,我们让进程睡眠10秒,以便观察信号的处理情况。

当程序运行时,首先会等待5秒钟,然后收到SIGALRM信号,调用关联的处理函数handler,输出"Received SIGALRM signal."的信息。

4.硬件异常产生信号

硬件异常产生信号是指由硬件设备或系统出现异常情况时,操作系统向进程发送的信号。这类信号通常与硬件故障、系统错误或异常事件相关。

在计算机系统中,硬件异常可以包括以下几种情况:

  1. 中断:当硬件设备需要处理或请求操作系统的服务时,会触发中断信号。例如,键盘输入、鼠标点击等。

  2. 故障:硬件设备出现故障时,会产生相应的故障信号。例如,内存错误、硬盘故障等。

  3. 异常事件:某些特殊的硬件或系统事件,如除零错误、内存保护错误等,也会触发异常信号。

操作系统会根据硬件异常的类型和严重程度,将相应的信号发送给受影响的进程。进程可以通过注册信号处理函数来捕获并处理这些信号。

在Linux系统中,常见的硬件异常产生的信号有:

  • SIGSEGV:当进程访问非法内存地址(如空指针)或执行无效的内存操作时,操作系统向进程发送SIGSEGV信号,表示段错误

  • SIGFPE:当发生浮点运算异常(如除零错误、溢出等)时,操作系统向进程发送SIGFPE信号。

  • SIGBUS:当进程访问非法地址或进行无效的总线操作时,操作系统向进程发送SIGBUS信号。

这些信号可以通过signal函数或者更为灵活的sigaction函数来注册处理函数,进程在接收到相应的信号后,可以执行特定的操作,如记录日志、处理异常情况或终止程序的执行。

需要注意的是,硬件异常产生的信号是由操作系统自动发出的,而不是进程主动发起的。进程可以通过注册信号处理函数来响应和处理这些信号,以保证程序的稳定性和可靠性。

🫐🫐🫐

无论信号有多少种产生方式,永远只能让OS向目标进程发送,因为OS是进程的管理者

👉🏻哪些信号无法被阻塞

在Linux系统中,有一些信号是无法被阻塞的,即使通过信号屏蔽集(signal mask)设置为阻塞这些信号,它们仍然会立即处理。这些信号通常被称为不可屏蔽信号(Unblockable Signals)。以下是一些常见的不可屏蔽信号:

  1. SIGKILL(信号编号为9):这是用于强制终止进程的信号,无法被阻塞或捕获。

  2. SIGSTOP(信号编号为19):这是用于暂停进程的信号,也无法被阻塞或捕获。

  3. SIGCONT(信号编号为18):这是用于恢复已暂停进程的信号,即使信号被阻塞,进程也会立即被唤醒。

  4. SIGKILLSIGSTOP 是两个特殊的信号,它们始终都可以终止或暂停一个进程。其他信号虽然也可能是不可屏蔽的,但通常情况下不会影响到进程的终止和暂停。


如上便是本期的所有内容了,如果喜欢并觉得有帮助的话,希望可以博个点赞+收藏+关注🌹🌹🌹❤️ 🧡 💛,学海无涯苦作舟,愿与君一起共勉成长

在这里插入图片描述
在这里插入图片描述

相关文章:

【Linux】信号-上

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb;信号的概念与产生jobs命令普通信号和实…...

uniapp 开发App 权限授权 js-sdk

从官网的插件市场下载的&#xff1a; 直接上代码&#xff1a; /*** 本模块封装了Android、iOS的应用权限判断、打开应用权限设置界面、以及位置系统服务是否开启*/var isIos // #ifdef APP-PLUS isIos (plus.os.name "iOS") // #endif// 判断推送权限是否开启 fu…...

【01】判断素数/质数(C语言)

目录 &#xff08;1&#xff09;素数特点&#xff1a;只能被1和本身整除 &#xff08;2&#xff09;代码如下&#xff1a; &#xff08;3&#xff09;运行结果如下 ​编辑 &#xff08;4&#xff09;函数引申 &#xff08;1&#xff09;素数特点&#xff1a;只能被1和本身…...

特征工程:特征提取和降维-上

目录 一、前言 二、正文 Ⅰ.主成分分析 Ⅱ.核主成分分析 三、结语 一、前言 前面介绍的特征选择方法获得的特征&#xff0c;是从原始数据中抽取出来的&#xff0c;并没有对数据进行变换。而特征提取和降维&#xff0c;则是对原始数据的特征进行相应的数据变换&#xff0c;并…...

前端JavaScript篇之强类型语言和弱类型语言的区别和对比

目录 强类型语言和弱类型语言的区别和对比总结 强类型语言和弱类型语言的区别和对比 强类型语言和弱类型语言是编程语言的两种不同类型系统&#xff0c;它们处理变量类型的方式有所不同。 强类型语言&#xff1a; 强类型语言要求在使用变量之前必须明确声明其类型&#xff0c;…...

[红日靶机渗透] ATKCK红队评估实战靶场三

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【ATK&CK红队评估实战靶场】 【VulnHub靶场复现】【面试分析】 &#x1f…...

网课:N皇后问题——牛客(题解和疑问)

题目描述 给出一个nnn\times nnn的国际象棋棋盘&#xff0c;你需要在棋盘中摆放nnn个皇后&#xff0c;使得任意两个皇后之间不能互相攻击。具体来说&#xff0c;不能存在两个皇后位于同一行、同一列&#xff0c;或者同一对角线。请问共有多少种摆放方式满足条件。 输入描述: …...

[大厂实践] Netflix容器平台内核panic可观察性实践

在某些情况下&#xff0c;K8S节点和Pod会因为出错自动消失&#xff0c;很难追溯原因&#xff0c;其中一种情况就是发生了内核panic。本文介绍了Netflix容器平台针对内核panic所做的可观测性增强&#xff0c;使得发生内核panic的时候&#xff0c;能够导出信息&#xff0c;帮助排…...

2024/2/8

数据类型与作用域练习 1、选择题 1.1、以下选项中,不能作为合法常量的是 ___b_______ A&#xff09;1.234e04 B&#xff09;1.234e0.4 C&#xff09;1.234e4 D&#xff09;1.234e0 1.2、以下定义变量并初始化错误的是______d_______。 A) char c1 ‘H’ &am…...

Verilog刷题笔记23

题目: Suppose you’re building a circuit to process scancodes from a PS/2 keyboard for a game. Given the last two bytes of scancodes received, you need to indicate whether one of the arrow keys on the keyboard have been pressed. This involves a fairly simp…...

C#验证字符串的长度,用正则表达式 vs 字符数组长度或字符串的长度

目录 一、使用的方法 1.使用正则表达式 2.通过计算字符串的长度验证 二、实例 1.源码 2.生成效果 一、使用的方法 1.使用正则表达式 使用正则表达式可以判断和限制用户输入的字符串长度。 比如验证用户密码不得少于8为&#xff0c;匹配的正则表达式"^.{8,}$"…...

opencv C++ dnn模块调用yolov5以及Intel RealSense D435深度相机联合使用进行目标检测

一、代码 #include <opencv2/opencv.hpp> #include <opencv2/dnn/dnn.hpp> #include <librealsense2/rs.hpp> // Include RealSense Cross Platform APIusing namespace cv; using namespace dnn; using namespace std; using namespace rs2;// 类名数组&am…...

2024牛客寒假算法基础集训营1(视频讲解全部题目)

2024牛客寒假算法基础集训营1&#xff08;题目全解&#xff09; ABCDEFGHIJKLM 2024牛客寒假算法基础集训营1&#xff08;视频讲解全部题目&#xff09; A #include<bits/stdc.h> #define endl \n #define deb(x) cout << #x << " " << …...

第三百一十三回

文章目录 1. 概念介绍2. 实现方法2.1 obscureText属性2.2 decoration属性 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何实现倒计时功能"相关的内容&#xff0c;本章回中将介绍如何实现密码输入框.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍…...

倒计时61天

M-智乃的36倍数(normal version)_2024牛客寒假算法基础集训营3 (nowcoder.com) //非ac代码,超时了,54.17/100#include<bits/stdc.h> using namespace std; const int N1e55; const int inf0x3f3f3f3f; #define int long long int n; string s1[N]; void solve() {cin>…...

npm后Truffle找不到命令(ubantu20系统)

Truffle找不到命令 方法1方法2 方法1 # 编辑.profile vim ~/.profile # 在.profile末尾把nodejs的解压路径添加到$PATH环境变量中 PATH"$HOME/bin:$HOME/.local/bin:路径:$PATH" source 文件方法2 #ls -l 在nodejs的bin目录下查看truffle链接的脚本文件 truffle -&…...

嵌入式学习第三篇——51单片机

目录 1&#xff0c;嵌入式系统 1&#xff0c;嵌入式系统的定义 2&#xff0c;单片机的定义 2&#xff0c;51单片机 1&#xff0c;开发环境 2&#xff0c;开发板使用的基本思路 1&#xff0c;查看原理图&#xff0c;查看芯片手册 2&#xff0c;获得调用硬件的管…...

RabbitMQ详解

RabbitMQ 1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&a…...

CGAL::2D Arrangements-4

4. Free函数 Arrangement_on_surface_2类模板是用曲线切分二维的面。因为它的接口设计是最简化的&#xff0c;这意味着它的成员函数很少执行几何操作。本章将解释怎么利用这些Free function来达到Arrangement操作。执行这些操作通常需要优秀的几何算法&#xff0c;而且有时会对…...

终端命令提示符:如何查看我们电脑端口是否被占用和处理方式

文章目录 端口信息查看1、Windows:2、Linux/macOS: 使用 netstat使用 lsof 端口信息查看 在不同的操作系统中&#xff0c;查看端口是否被占用的指令有所不同。以下是一些常见的指令&#xff1a; 1、Windows: 使用命令行工具 netstat 来查看端口占用情况。 电脑键盘按住 win…...

elasticsearch重置密码操作

安装es的时候需要测试这个url&#xff1a;http://127.0.0.1:9200/ 出现弹窗让我输入账号和密码。我第一次登录&#xff0c;没有设置过账号和密码&#xff0c; 解决方法是&#xff1a;在es的bin目录下打开cmd窗口&#xff0c;敲命令&#xff1a;.\elasticsearch-reset-password…...

从零开始手写mmo游戏从框架到爆炸(零)—— 导航

从今天开始我们尝试从零开始写一个mmo的游戏。主要技术还是netty。参考了网上很多的大神的框架&#xff0c;本来希望基于ioGame或者vert.x等来直接写功能的&#xff0c;觉得从零开始更有意义&#xff0c;而且咱们也不需要太NB的底层功能&#xff0c;够用就行。 下面是导航&…...

机器学习7-K-近邻算法(K-NN)

K-Nearest Neighbors&#xff08;K-近邻算法&#xff0c;简称KNN&#xff09;是一种基本的监督学习算法&#xff0c;用于解决分类和回归问题。KNN的核心思想是基于距离度量&#xff0c;在特征空间中找到最近的K个样本&#xff0c;然后使用它们的标签进行决策。以下是KNN的基本概…...

相机图像质量研究(7)常见问题总结:光学结构对成像的影响--镜片固化

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…...

猫头虎分享已解决Bug || Go Error: cannot convert int to string

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …...

前端bug手册

JavaScript错误&#xff1a;常见的JavaScript错误包括语法错误、未定义的变量、类型错误等。这些错误可能导致页面无法正常运行或功能无法正常使用。样式问题&#xff1a;前端开发中常见的样式问题包括布局错乱、元素位置不正确、样式覆盖等。这些问题可能导致页面显示不正常或…...

Elasticsearch中Document Routing特性

Document Routing在Elasticsearch中是一种高级特性&#xff0c;它允许用户在索引文档时指定一个路由值。通过这种方式&#xff0c;可以确保具有相同路由值的所有文档都存储在同一个分片中。这对于提高查询效率特别有用&#xff0c;因为它允许查询只针对包含相关文档的特定分片&…...

【Git版本控制 03】远程操作

目录 一、克隆远程仓库 二、推送远程仓库 三、拉取远程仓库 四、忽略特殊文件 五、命令配置别名 一、克隆远程仓库 Git是分布式版本控制系统&#xff0c;同⼀个Git仓库&#xff0c;可以分布到不同的机器上。怎么分布呢&#xff1f; 找⼀台电脑充当服务器的⻆⾊&#xff…...

【Git】Windows下通过Docker安装GitLab

私有仓库 前言基本思路拉取镜像创建挂载目录创建容器容器启动成功登录仓库设置中文更改密码人员审核配置邮箱 前言 由于某云存在人数限制&#xff0c;这个其实很好理解&#xff0c;毕竟使用的是云服务器&#xff0c;人家也是要交钱的。把代码完全放在别人的服务器上面&#xf…...

flutter 操作mysql

引入模块 dependencies: flutter: sdk: flutter mysql1: ^0.20.0 mysql helper 的代码 import dart:async; import package:mysql1/mysql1.dart; class MySqlHelper { static const _host localhost; static const _port 3333; static const _user user; static c…...

c++阶梯之类与对象(中)< 续集 >

前文&#xff1a; c阶梯之类与对象&#xff08;上&#xff09;-CSDN博客 c阶梯之类与对象&#xff08;中&#xff09;-CSDN博客 前言&#xff1a; 在上文中&#xff0c;我们学习了类的六个默认成员函数之构造&#xff0c;析构与拷贝构造函数&#xff0c;接下来我们来看看剩下…...

GitLag所有操作-汇总

1、MAC Git环境设置 跳转 Git通过Token拉代码&#xff1a; 跳转 Git基础操作&#xff1a;拉、put、删 跳转 Git回滚操作&#xff1a; 跳转 Git回滚操作-复杂 跳转 对于Commit但是还没有push的代码&#xff0c;如果回滚&#xff1a; 跳转...

JSch - 配置SFTP服务器SSH免密登录

文章目录 1. 什么是SFTP2. 什么是Jsch以及它的作用3. Linux中配置SSH密钥登录4. sftp服务器认证机制5. publickey和password两种方式登录sftp的API调用6. 代码可以如下改造&#xff1a; 需求&#xff1a;做一个通过ssh免密登录的需求&#xff0c;是基于原先密码登录sftp服务器的…...

RISC-V指令格式

RISC-V指令格式 1 RISC-V指令集命名规范2 RISC-V指令集组成2.1 基础整数指令集2.2 扩展指令集 3 RISC-V指令格式3.1 指令表述3.2 指令格式 本文属于《 RISC-V指令集基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 RISC-V指令集命名规范 前面提到过RV32I&#xff0c;这是…...

Linux 文件比较工具

在Linux系统中&#xff0c;文件比较是一种常见的任务&#xff0c;用于比较两个文件之间的差异。文件比较可以帮助我们找出两个文件的不同之处&#xff0c;或者确定它们是否完全相同。在Linux中&#xff0c;有多种方法可以进行文件比较。 1. diff 在Linux中&#xff0c;diff命…...

【GAMES101】Lecture 17 材质

目录 材质 漫反射 镜面反射 折射-Snell’s Law Fresnel Reflection / Term&#xff08;菲涅耳项&#xff09; 微表面模型 各向同性与各向异性 BRDF的性质 测量BRDF 材质 渲染方程中的BRDF描述了物体是如何与光线作用的&#xff0c;而物体的材质决定了它看起来是怎么样…...

数模.matlab画图

一、mesh函数 上图是平常用到的方式 例题&#xff1a; 上图的meshgrid函数相当于上上图的前三个指令&#xff08;temp&#xff0c;x,y&#xff09; mash函数&#xff1a; mashc函数&#xff1a; mashz函数&#xff1a; 上图subplot函数的作用是将下标为index的图片放到对应的x&…...

[word] word表格表头怎么取消重复出现? #媒体#笔记#职场发展

word表格表头怎么取消重复出现&#xff1f; word表格表头怎么取消重复出现&#xff1f;在Word中的表格如果过长的话&#xff0c;会跨行显示在另一页&#xff0c;如果想要在其它页面上也显示表头&#xff0c;更直观的查看数据。难道要一个个复制表头吗&#xff1f;当然不是&…...

vue项目开发vscode配置

配置代码片段 步骤如下&#xff1a; 文件->首选项->配置用户代码片段新增全局代码片段起全局代码片段文件名“xxx.code-snippets” 这里以配置vue2初始代码片段为例&#xff0c;配置具体代码片段 {"name": "vue-sph","version": "…...

BUUCTF-Real-[Tomcat]CVE-2017-12615

目录 漏洞描述 一、漏洞编号&#xff1a;CVE-2017-12615 二、漏洞复现 get flag 漏洞描述 CVE-2017-12615&#xff1a;远程代码执行漏洞 影响范围&#xff1a;Apache Tomcat 7.0.0 - 7.0.79 (windows环境) 当 Tomcat 运行在 Windows 操作系统时&#xff0c;且启用了 HTTP P…...

Qt应用软件【协议篇】http协议get、post示例

文章目录 QT Http的APIHTTP GET 请求示例HTTP POST 请求示例伪装chrome浏览器get请求QT Http的API QNetworkAccessManager 作用:管理所有的网络请求,是发送请求和接收响应的中心点。主要功能: 发送HTTP请求(GET, POST, PUT, DELETE等)。处理网络请求的异步回调。管理网络…...

如何选择Centos的替代者

开篇废话&#xff1a;许久许久没有更新博客了。寒假回到故土&#xff0c;大雪虽然没有封路&#xff0c;还是增加了不出门的决心&#xff0c;虽然年岁已高&#xff0c;但是不学习还是不踏实&#xff0c;那就借着写作再继续前行。 背景&#xff1a;信息化部门&#xff0c;掌管着…...

【Java数据结构】ArrayList和LinkedList的遍历

一&#xff1a;ArrayList的遍历 import java.util.ArrayList; import java.util.Iterator; import java.util.List;/*** ArrayList的遍历*/ public class Test {public static void main(String[] args) {List<Integer> list new ArrayList<>();list.add(5);list…...

springboot163美食推荐商城的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…...

[机器学习]K-means——聚类算法

一.K-means算法概念 二.代码实现 # 0. 引入依赖 import numpy as np import matplotlib.pyplot as plt # 画图依赖 from sklearn.datasets import make_blobs # 从sklearn中直接生成聚类数据# 1. 数据加载 # 生成&#xff08;n_samples&#xff1a;样本点&#xff0c;centers&…...

并发编程 java锁机制

1、什么是锁&#xff0c;为什么需要锁&#xff1f; 并发环境下&#xff0c;会存在多个线程对同一个资源进行争抢的情况&#xff0c;假设线程A对资源正在进行修改&#xff0c;此时线程B又对同一资源进行了修改&#xff0c;就会导致数据不一致的问题。为了解决这个问题&#xff…...

Onerugged三防平板厂家丨三年质保承诺丨三防平板PAD

行业领先产品——Onerugged三防平板。凭借着十年的经验&#xff0c;我们深知终端设备在各个行业中的重要性&#xff0c;因此致力于为用户提供高可靠性的解决方案。 Onerugged三防平板以其卓越的性能和全方位的保护功能&#xff0c;在市场上脱颖而出。首先&#xff0c;它拥有IP…...

Android 系统启动流程

一.Android系统启动流程基本框架 Android系统完整的启动过程&#xff0c;从系统层次角度可分为 Linux 系统层、Android 系统服务层、Zygote进程模型三个阶段&#xff1b;从开机到启动 Home Launcher 完成具体的任务细节可分为七个步骤&#xff0c;下面就从具体的细节来解读 And…...

鸿蒙学习-app.json5配置文件

官网文档参考&#xff1a;https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/app-configuration-file-0000001427584584-V3 位于AppScope下的app.json5配置文件 一、基础属性 {"app": {/*包名*/"bundleName": "com.example.dem…...

华为OD机试 - 智能成绩表( Python C C++ JavaGo JS PHP)

题目描述 小明是一名新老师&#xff0c;他需要将学生按考试总分或单科分数进行排名。学生的信息包括姓名、科目和对应的分数。帮助小明完成这个任务吧&#xff01; 输入描述 第一行包含两个整数 n 和 m&#xff0c;分别代表学生人数和科目数量。 0 < n < 1000 < m &…...