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

嵌入式Linux:如何监视子进程

目录

1、wait()函数

2、waitpid()函数

3、SIGCHLD信号


在嵌入式Linux系统中,父进程通常需要创建子进程来执行特定任务,例如处理网络请求、执行计算任务等。监视子进程的状态不仅可以确保资源的合理利用,还能防止僵尸进程的产生,从而提升系统的稳定性和性能。wait()waitpid()是用于监视和管理子进程的关键系统调用,而SIGCHLD信号则提供了一种异步通知机制,以便父进程在子进程状态发生变化时采取相应的措施。

1、wait()函数

wait()系统调用用于让父进程等待任意一个子进程的终止,并获取该子进程的终止状态信息。它执行以下功能:

  • 等待子进程终止:父进程在调用wait()后会阻塞,直到其任意一个子进程终止为止。
  • 回收子进程资源:当子进程终止时,操作系统需要回收它占用的资源,这一过程称为“收尸”。如果不进行回收,子进程会变为僵尸进程,占用系统资源。

僵尸进程是已经终止,但父进程尚未读取其终止状态的子进程。通过调用wait()可以避免系统中积累僵尸进程,影响性能和稳定性。

函数原型如下:

#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);

参数与返回值:

  • status:这是一个指向int的指针,用于存储子进程的退出状态。父进程可以通过这个状态了解子进程是正常退出还是被信号中止的。如果传入NULL,则表示不关心子进程的退出状态,仅仅是等待它终止。

  • 返回值:返回已终止的子进程的进程ID;如果调用时没有子进程存在,wait()返回-1,并将errno设为ECHILD表示没有子进程可等待。

函数行为:

  • 阻塞等待wait()会阻塞调用进程,直到任意一个子进程终止。如果所有子进程都还在运行,wait()将持续阻塞。
  • 资源回收:当子进程终止时,wait()除了获取子进程的终止状态,还会回收子进程的资源,避免产生僵尸进程。
  • 处理已终止的子进程:如果wait()调用时有子进程已终止,函数将立即返回,而不会阻塞。

状态检查:

使用宏可以检查和处理status参数中存储的子进程终止状态:

  • WIFEXITED(status):如果子进程是通过exit()_exit()正常终止的,则返回true

  • WEXITSTATUS(status):当WIFEXITED(status)true时,可以通过该宏获取子进程的退出状态,通常是子进程在调用exit()_exit()时的退出码。

  • WIFSIGNALED(status):如果子进程因接收到某个信号而异常终止,则返回true

  • WTERMSIG(status):当WIFSIGNALED(status)true时,可以通过该宏获取导致子进程终止的信号编号。

  • WIFSTOPPED(status):如果子进程处于暂停状态,则返回true

  • WSTOPSIG(status):当WIFSTOPPED(status)true时,可以获取导致子进程暂停的信号编号。

  • WCOREDUMP(status):如果子进程终止时生成了核心转储文件,则返回true

以下示例展示了如何使用wait()函数来监视子进程的终止状态。

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>int main() {pid_t pid = fork();  // 创建子进程if (pid == -1) {// fork()失败perror("fork failed");exit(EXIT_FAILURE);} else if (pid == 0) {// 子进程执行代码printf("Child process running (PID: %d)...\n", getpid());sleep(2);  // 模拟子进程的执行exit(42);  // 正常退出,并返回状态码42} else {// 父进程执行代码int status;pid_t child_pid = wait(&status);  // 等待任一子进程终止if (child_pid > 0) {// 子进程终止后的处理if (WIFEXITED(status)) {printf("Child process %d terminated with status: %d\n", child_pid, WEXITSTATUS(status));} else if (WIFSIGNALED(status)) {printf("Child process %d was terminated by signal: %d\n", child_pid, WTERMSIG(status));}} else {perror("wait failed");}}return 0;
}

在这段代码中,父进程创建了一个子进程并等待其终止,同时通过status宏获取子进程的退出状态。

wait()函数的局限性:

  • 无法指定特定子进程wait()无法让父进程选择等待某个特定的子进程,它只能按顺序等待下一个终止的子进程。如果父进程同时拥有多个子进程,wait()将随机处理任意一个子进程的终止。

  • 阻塞等待wait()始终是阻塞的,直到有子进程终止为止。如果父进程需要继续处理其他任务,则wait()的阻塞可能导致父进程效率低下。

2、waitpid()函数

waitpid()函数提供了更多的控制选项,使得父进程可以选择性地等待某个特定子进程,或进行非阻塞的等待。

函数原型如下:

#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);

参数:

  • pid:指定需要等待的子进程:
    • > 0:等待指定PID的子进程。
    • = 0:等待与调用进程同一进程组的任意子进程。
    • < -1:等待进程组ID等于pid绝对值的所有子进程。
    • = -1:等待任意子进程,与wait()等价。
  • status:与wait()status参数相同。
  • options:可以设置为0或包含以下标志:
    • WNOHANG:非阻塞模式。如果没有子进程终止,立即返回0
    • WUNTRACED:返回因信号停止的子进程的状态。
    • WCONTINUED:返回收到SIGCONT信号后恢复运行的子进程的状态。

返回值:

  • 成功时,返回已终止或状态已改变的子进程的PID。
  • 如果没有符合条件的子进程,且设置了WNOHANG选项,返回0
  • 失败时返回-1,并设置errno

waitpid()wait()的区别:

  • 等待特定子进程waitpid()允许父进程通过pid参数指定特定的子进程,而wait()只能等待任意子进程。
  • 非阻塞模式waitpid()支持非阻塞模式(通过WNOHANG),使父进程可以立即返回,而不必等待子进程终止。
  • 支持更多状态监控waitpid()可以监视子进程暂停(WUNTRACED)或恢复运行(WCONTINUED)的状态,而wait()无法做到这一点。

示例代码:

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>int main() {pid_t pid = fork();  // 创建子进程if (pid == -1) {// fork()失败perror("fork failed");exit(EXIT_FAILURE);} else if (pid == 0) {// 子进程执行代码printf("Child process running (PID: %d)...\n", getpid());sleep(2);  // 模拟子进程工作exit(42);  // 正常退出,返回状态码42} else {// 父进程执行代码int status;pid_t child_pid;// 非阻塞等待子进程do {child_pid = waitpid(pid, &status, WNOHANG);  // 非阻塞模式if (child_pid == 0) {printf("No child process terminated yet. Doing other work...\n");sleep(1);  // 模拟其他工作} else if (child_pid > 0) {if (WIFEXITED(status)) {printf("Child process %d terminated with status: %d\n", child_pid, WEXITSTATUS(status));} else if (WIFSIGNALED(status)) {printf("Child process %d was terminated by signal: %d\n", child_pid, WTERMSIG(status));}} else {perror("waitpid failed");exit(EXIT_FAILURE);}} while (child_pid == 0);printf("Parent process continues...\n");}return 0;
}

在这个示例中,父进程可以继续处理其他任务,而不必一直阻塞等待子进程的终止。waitpid()的非阻塞模式使得程序更为灵活和高效。 

3、SIGCHLD信号

SIGCHLD是父进程在子进程状态发生变化(如终止或暂停)时收到的信号。通过捕获SIGCHLD信号,父进程可以实时地检测到子进程的状态变化,并采取相应的行动(例如回收资源)。

在POSIX标准下,sigaction()系统调用被广泛用于设置信号处理程序。相比于传统的signal()函数,sigaction()提供了更多的选项和更好的控制。

示例代码:

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>void sigchld_handler(int signum) {int status;pid_t pid;// 循环调用waitpid,以确保处理多个已终止的子进程while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {if (WIFEXITED(status)) {printf("Child process %d terminated with status: %d\n", pid, WEXITSTATUS(status));} else if (WIFSIGNALED(status)) {printf("Child process %d was terminated by signal: %d\n", pid, WTERMSIG(status));}}
}int main() {struct sigaction sa;sa.sa_handler = sigchld_handler;  // 指定信号处理函数sigemptyset(&sa.sa_mask);  // 清空阻塞信号集sa.sa_flags = SA_RESTART;  // 自动重启被中断的系统调用sigaction(SIGCHLD, &sa, NULL);  // 安装信号处理程序for (int i = 0; i < 3; i++) {pid_t pid = fork();  // 创建多个子进程if (pid == 0) {// 子进程代码printf("Child process %d running...\n", getpid());sleep(2);exit(42);}}// 父进程的其他工作while (1) {printf("Parent process working...\n");sleep(1);}return 0;
}

使用sigaction()的优点:

  • 自动重启:通过设置SA_RESTART标志,能够在信号处理完成后自动重启被中断的系统调用(如read()write())。
  • 可靠的信号处理sigaction()避免了传统signal()函数的缺陷,确保了信号处理的可靠性和可移植性。

SIGCHLD信号的常见问题与解决方案:

  • 丢失信号:在同时终止多个子进程时,可能会丢失一些SIGCHLD信号。为解决这一问题,可以在信号处理程序中循环调用waitpid(),直到没有子进程终止为止。
  • 阻塞的系统调用:信号处理可能会中断一些阻塞的系统调用(如read()sleep()),导致它们返回错误。通过使用sigaction()SA_RESTART标志可以自动重启被中断的调用。

通过以上内容,开发者可以根据实际需求选择合适的方法来监视和管理子进程,确保程序运行的稳定性和资源的有效利用。

  • 如果只需等待任意一个子进程终止且不关心特定子进程,使用wait()是最简单的选择。
  • 如果需要非阻塞地等待特定子进程或需要获取更多子进程状态信息,waitpid()则更为灵活。
  • 在处理多个子进程时,捕获SIGCHLD信号可以让父进程更加实时地处理子进程的终止,并在不中断父进程正常操作的情况下回收子进程资源。

无论是使用wait()waitpid()还是SIGCHLD信号处理,确保及时回收子进程的资源是避免僵尸进程的关键。

相关文章:

嵌入式Linux:如何监视子进程

目录 1、wait()函数 2、waitpid()函数 3、SIGCHLD信号 在嵌入式Linux系统中&#xff0c;父进程通常需要创建子进程来执行特定任务&#xff0c;例如处理网络请求、执行计算任务等。监视子进程的状态不仅可以确保资源的合理利用&#xff0c;还能防止僵尸进程的产生&#xff0c…...

【信息系统项目管理师-选择真题】2010上半年综合知识答案和详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1~2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第21题】…...

工作总结:压测篇

前言 压测是测试需要会的一项技能&#xff0c;作为开发&#xff0c;有点时候也要会一点压测。也是被逼着现学现卖的。 一、压测是什么&#xff0c;以及压测工具的选择 压测&#xff0c;即压力测试&#xff0c;是一种性能测试手段&#xff0c;通过模拟大量用户同时访问系统&am…...

doris:STRUCT

STRUCT<field_name:field_type [COMMENT comment_string], ... > 表示由多个 Field 组成的结构体&#xff0c;也可被理解为多个列的集合。 不能作为 Key 使用&#xff0c;目前 STRUCT 仅支持在 Duplicate 模型的表中使用。一个 Struct 中的 Field 的名字和数量固定&…...

二叉树介绍

一.树的概念 树的图&#xff1a; 1.结点的度&#xff1a;一个结点含有子树的个数称为该结点的度&#xff1b; 如上图&#xff1a;A的度为6 2.树的度&#xff1a;一棵树中&#xff0c;所有结点度的最大值称为树的度&#xff1b; 如上图&#xff1a;树的度为6 3.叶子结点或终…...

通过Ngrok实现内网穿透助力远程开发

在现代软件开发和网络应用的环境下&#xff0c;开发人员常常需要在本地搭建服务器进行调试、测试或演示。然而&#xff0c;传统的端口映射&#xff08;如使用 NAT 或 SSH 隧道&#xff09;配置繁琐&#xff0c;且并非所有环境都允许直接暴露本地服务。ngrok 作为一款强大的隧道…...

DeepSeek-R1:通过强化学习激励大型语言模型(LLMs)的推理能力

摘要 我们推出了第一代推理模型&#xff1a;DeepSeek-R1-Zero和DeepSeek-R1。DeepSeek-R1-Zero是一个未经监督微调&#xff08;SFT&#xff09;作为初步步骤&#xff0c;而是通过大规模强化学习&#xff08;RL&#xff09;训练的模型&#xff0c;展现出卓越的推理能力。通过强…...

Node.js基础

浏览器知识 浏览器 个浏览器都内置了DOM、BOM等API函数&#xff0c;供浏览器中的Javascript调用。 每个浏览器都有对应的JavaScript解析引擎。 浏览器中的JavaScript环境 V8引擎负责解析和执行JavaScript代码 内置API是由运行环境提供的特殊接口&#xff0c;只能在所属的运…...

DeepSeek R1:中国AI黑马的崛起与挑战

在人工智能&#xff08;AI&#xff09;领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;正以迅猛之势重塑世界&#xff0c;其发展速度和影响力令人瞩目。近期&#xff0c;中国DeepSeek公司发布的DeepSeek R1模型&#xff0c;宛如一颗璀璨新星&#xff0c;凭借卓越的推…...

【JavaEE】_MVC架构与三层架构

目录 1. MVC架构 2. 三层架构 3. MVC架构与三层架构的对比 3.1 MVC与三层架构的对比 3.2 MVC与三层架构的共性 1. MVC架构 在前文已介绍关于SpringMAC的设计模式&#xff0c;详见下文&#xff1a; 【JavaEE】_Spring Web MVC简介-CSDN博客文章浏览阅读967次&#xff0c;点…...

对比DeepSeek、ChatGPT和Kimi的学术写作摘要能力

摘要 摘要是文章的精华&#xff0c;通常在200-250词左右。要包括研究的目的、方法、结果和结论。让AI工具作为某领域内资深的研究专家&#xff0c;编写摘要需要言简意赅&#xff0c;直接概括论文的核心&#xff0c;为读者提供快速了解的窗口。 下面我们使用DeepSeek、ChatGPT…...

ts 进阶

吴悠讲编程 : 20分钟TypeScript进阶&#xff01;无废话快速提升水平 前端速看 https://www.bilibili.com/video/BV1q64y1j7aH...

Kubernetes(一)

Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排平台&#xff0c;已经成为现代云原生应用的核心技术&#xff0c;主要应用于对容器化应用程序的自动化部署、扩展以及管理。k8s配备了一组核心组件以及一系列功能&#xff0c;这些组件能够实现容器的调度、负载均…...

Python里的小整数问题挺有意思的

简单来说&#xff0c;Python为了优化性能&#xff0c;会把一些常用的整数&#xff08;通常是-5到256&#xff09;提前创建好&#xff0c;放到一个“缓存池”里。这样&#xff0c;当你用到这些小整数时&#xff0c;Python就不用每次都重新创建对象了&#xff0c;直接从缓存池里拿…...

基于 Jenkins 的测试报告获取与处理并写入 Jira Wiki 的技术总结

title: 基于 Jenkins 的测试报告获取与处理并写入 Jira Wiki 的技术总结 tags: - jenkins - python categories: - jenkins在软件开发的持续集成与持续交付&#xff08;CI/CD&#xff09;流程里&#xff0c;及时、准确地获取并分析测试报告对保障软件质量至关重要。本文将详细…...

java.util.Random类(详细案例拆解)(已完结)

前言&#xff1a; 小编打算近期更俩三期类的专栏&#xff0c;一些常用的专集类&#xff0c;给大家分好类别总结和详细的代码举例解释。 今天是除夕&#xff0c;小编先祝贺大家除夕快乐啦&#xff01;&#xff01; 今天是第六个 java.lang.Math 包中的 java.util.Random类 我…...

CMake常用命令指南(CMakeList.txt)

CMakeList从入门到精通的文章有很多不再赘述&#xff08; 此处附带一篇优秀的博文链接&#xff1a;一个简单例子&#xff0c;完全入门CMake语法与CMakeList编写 &#xff09;。 本文主要列举 CMake 中常用命令的详细说明、优缺点分析以及推荐做法&#xff0c;以更好地理解和灵…...

Mybatis是如何进行分页的?

大家好&#xff0c;我是锋哥。今天分享关于【Mybatis是如何进行分页的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Mybatis是如何进行分页的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MyBatis 实现分页的方式有很多种&#xff0c;最常见…...

推动知识共享的在线知识库实施与优化指南

内容概要 在当今迅速发展的数字化时代&#xff0c;在线知识库的实施显得尤为重要。它不仅为企业提供了高效的信息存储与共享平台&#xff0c;还能够有效促进团队成员之间的协作与知识传递。通过集中管理企业内的各类知识资源&#xff0c;在线知识库帮助员工快速查找所需信息&a…...

【最后203篇系列】007 使用APS搭建本地定时任务

说明 最大的好处是方便。 其实所有任务的源头&#xff0c;应该都是通过定时的方式&#xff0c;在每个时隙发起轮询。当然在任务的后续传递中&#xff0c;可以通过CallBack或者WebHook的方式&#xff0c;以事件的形态进行。这样可以避免长任务执行的过程中进行等待和轮询。 总结…...

为AI聊天工具添加一个知识系统 之78 详细设计之19 正则表达式 之6

本文要点 要点 本项目设计的正则表达式 是一个 动态正则匹配框架。它是一个谓词系统&#xff1a;谓词 是运动&#xff0c;主语是“维度”&#xff0c;表语是 语言处理。主语的一个 双动结构。 Reg三大功能 语法验证、语义检查和 语用检验&#xff0c;三者 &#xff1a;语义约…...

三天急速通关JavaWeb基础知识:Day 1 后端基础知识

三天急速通关JavaWeb基础知识&#xff1a;Day 1 后端基础知识 0 文章说明1 Http1.1 介绍1.2 通信过程1.3 报文 Message1.3.1 请求报文 Request Message1.3.2 响应报文 Response Message 2 XML2.1 介绍2.2 利用Java解析XML 3 Tomcat3.1 介绍3.2 Tomcat的安装与配置3.3 Tomcat的项…...

代理模式 -- 学习笔记

代理模式学习笔记 什么是代理&#xff1f; 代理是一种设计模式&#xff0c;用户可以通过代理操作&#xff0c;而真正去进行处理的是我们的目标对象&#xff0c;代理可以在方法增强&#xff08;如&#xff1a;记录日志&#xff0c;添加事务&#xff0c;监控等&#xff09; 拿一…...

前端-Rollup

Rollup 是一个用于 JavaScript 的模块打包工具&#xff0c;它将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式&#xff0c;而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许你自由…...

EtherCAT主站IGH-- 21 -- IGH之fsm_reboot.h/c文件解析

EtherCAT主站IGH-- 21 -- IGH之fsm_reboot.h/c文件解析 0 预览一 该文件功能`fsm_reboot.c` 文件功能函数预览二 函数功能介绍`fsm_reboot.c` 中主要函数的作用1. `ec_fsm_reboot_init`2. `ec_fsm_reboot_clear`3. `ec_fsm_reboot_single`4. `ec_fsm_reboot_all`5. `ec_fsm_reb…...

【NLP251】NLP RNN 系列网络

NLP251 系列主要记录从NLP基础网络结构到知识图谱的学习 &#xff11;.原理及网络结构 &#xff11;.&#xff11;&#xff32;&#xff2e;&#xff2e; 在Yoshua Bengio论文中( http://proceedings.mlr.press/v28/pascanu13.pdf )证明了梯度求导的一部分环节是一个指数模型…...

数据分析系列--④RapidMiner进行关联分析(案例)

一、核心概念 1.1项集&#xff08;Itemset&#xff09; 1.2规则&#xff08;Rule&#xff09; 1.3支持度&#xff08;Support&#xff09; 1.3.1 支持度的定义 1.3.2 支持度的意义 1.3.3 支持度的应用 1.3.4 支持度的示例 1.3.5 支持度的调整 1.3.6 支持度与其他指标的…...

深度学习:基于MindNLP的RAG应用开发

什么是RAG&#xff1f; RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09; 是一种结合检索&#xff08;Retrieval&#xff09;和生成&#xff08;Generation&#xff09;的技术&#xff0c;旨在提升大语言模型&#xff08;LLM&#xff09;生…...

Hive安装教程

Hive安装教程 文章目录 Hive安装教程写在前面安装下载安装部署安装Hive启动并使用Hive MySQL安装检查当前系统是否安装过MySQL安装初始化数据库 Hive元数据配置到MySQL拷贝驱动配置Metastore到MySQL再次启动Hive 写在前面 Linux版本&#xff1a;CentOS7.5Hive版本&#xff1a;…...

安卓逆向之脱壳-认识一下动态加载 双亲委派(二)

一&#xff1a;动态加载与双亲委派模型 在 Java 和 Android 中&#xff0c;ClassLoader 是一个非常重要的组件&#xff0c;负责将 .class 文件或 .dex 文件的字节码加载到内存中&#xff0c;供程序使用。在这其中&#xff0c;有两种关键的概念需要深入理解&#xff1a;动态加载…...

全程Kali linux---CTFshow misc入门(14-24)

第十四题&#xff1a; dd命令&#xff1a;dd是一个用于复制和转换数据的命令&#xff0c;它可以对文件、设备等进行操作&#xff0c;在数据备份、转换格式等场景经常使用。 ifmisc14.jpg&#xff1a;if表示 “input file”&#xff08;输入文件&#xff09;&#xff0c;这里指…...

学习数据结构(3)顺序表

1.动态顺序表的实现 &#xff08;1&#xff09;初始化 &#xff08;2&#xff09;扩容 &#xff08;3&#xff09;头部插入 &#xff08;4&#xff09;尾部插入 &#xff08;5&#xff09;头部删除 &#xff08;这里注意要保证有效数据个数不为0&#xff09; &#xff08;6&a…...

知识体系、知识管理角度的赚钱思考

从知识管理和知识体系的角度出发&#xff0c;赚钱的问题思考清单可以帮助你系统地梳理和优化自己在财富创造方面的策略。 以下是一个详细的清单&#xff0c;涵盖从知识获取、技能提升到实际应用的各个环节&#xff0c;帮助你在赚钱的道路上更加高效和有条理。 一、赚钱的目标与…...

(done) ABI 相关知识补充:内核线程切换、用户线程切换、用户内核切换需要保存哪些寄存器?

由于操作系统和编译器约定了 ABI&#xff0c;如下&#xff1a; 编译器在对 C 语言编译时&#xff0c;会自动 caller 标注的寄存器进行保存恢复。保存的步骤通常发生在进入函数的时候&#xff0c;恢复的步骤通常发生在从函数返回的时候。 内核线程切换需要保存的寄存器&#…...

QT6 + CMAKE编译OPENCV3.9

参考文档 [1] https://blog.csdn.net/rjkf_css/article/details/135676077 前提条件 配置好相关运行环境&#xff1a;QT6、OPENCV3.9的sources文件 OPENCV下载网页&#xff1a;https://opencv.org/releases/ QT6下载教程&#xff1a;https://blog.csdn.net/caoshangpa/article…...

Linux 常用命令——系统设置篇(保姆级说明)

系统设置类 显示当前运行的进程&#xff08;ps&#xff09; ps [options] [--help]# 查找指定进程格式&#xff1a; ps -ef | grep 进程关键字# 显示进程信息 ps -A 参数&#xff1a; -A 列出所有的进程 -w 显示加宽可以显示较多的资讯 -au 显示较详细的资讯 -aux 显示所有包…...

完美世界前端面试题及参考答案

如何设置事件捕获和事件冒泡? 在 JavaScript 中,可以通过addEventListener方法来设置事件捕获和事件冒泡。该方法接收三个参数,第一个参数是事件类型,如click、mousedown等;第二个参数是事件处理函数;第三个参数是一个布尔值,用于指定是否使用事件捕获机制。当这个布尔值…...

Vue3笔记——(三)hooks、路由

015 hooks 作用&#xff1a;使得代码更加模块化和可维护 Person.vue <template><div><h2>当前求和{{ sum }}</h2><button click"addFn">点我sum1</button></div> </template> <script setup lang"ts"…...

网络安全大模型和人工智能场景及应用理解

本文通过通俗易懂的方式的进行阐述&#xff0c;大家读完觉得有帮助记得及时关注和点赞&#xff01;&#xff01;&#xff01; 一、网络安全大模型的概述 网络安全大模型是一种用于识别和应对各种网络安全威胁的模型。它通过分析网络数据包、网络行为等信息&#xff0c;识别潜在…...

python-leetcode-从中序与后序遍历序列构造二叉树

106. 从中序与后序遍历序列构造二叉树 - 力扣&#xff08;LeetCode&#xff09; # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right r…...

NLP模型大对比:Transformer > RNN > n-gram

结论 Transformer 大于 RNN 大于 传统的n-gram n-gram VS Transformer 我们可以用一个 图书馆查询 的类比来解释它们的差异&#xff1a; 一、核心差异对比 维度n-gram 模型Transformer工作方式固定窗口的"近视观察员"全局关联的"侦探"依赖距离只能看前…...

MySQL查询优化(三):深度解读 MySQL客户端和服务端协议

如果需要从 MySQL 服务端获得很高的性能&#xff0c;最佳的方式就是花时间研究 MySQL 优化和执行查询的机制。一旦理解了这些&#xff0c;大部分的查询优化是有据可循的&#xff0c;从而使得整个查询优化的过程更有逻辑性。下图展示了 MySQL 执行查询的过程&#xff1a; 客户端…...

[STM32 - 野火] - - - 固件库学习笔记 - - -十三.高级定时器

一、高级定时器简介 高级定时器的简介在前面一章已经介绍过&#xff0c;可以点击下面链接了解&#xff0c;在这里进行一些补充。 [STM32 - 野火] - - - 固件库学习笔记 - - -十二.基本定时器 1.1 功能简介 1、高级定时器可以向上/向下/两边计数&#xff0c;还独有一个重复计…...

Antd React Form使用Radio嵌套多个Select和Input的处理

使用Antd React Form使用Radio会遇到嵌套多个Select和Input的处理&#xff0c;需要多层嵌套和处理默认事件和冒泡&#xff0c;具体实现过程直接上代码。 实现效果布局如下图 代码 <Formname"basic"form{form}labelWrap{...formItemLayoutSpan(5, 19)}onFinish{on…...

固有频率与模态分析

目录 引言 1. 固有频率&#xff1a;物体的“天生节奏” 1.1 定义 1.2 关键特点 1.3 实际意义 2. 有限元中的模态分析&#xff1a;给结构“体检振动” 2.1 模态分析的意义 2.2 实际案例 2.2.1 桥梁模态分析 2.2.2 飞机机翼模态分析 2.2.3 具体事例 3. 模态分析的工具…...

视频多模态模型——视频版ViT

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细解读多模态论文《ViViT: A Video Vision Transformer》&#xff0c;2021由google 提出用于视频处理的视觉 Transformer 模型&#xff0c;在视频多模态领域有…...

2859.计算K置位下标对应元素的和

示例 1&#xff1a;输入&#xff1a;nums [5,10,1,5,2], k 1 输出&#xff1a;13 解释&#xff1a;下标的二进制表示是&#xff1a; 0 0002 1 0012 2 0102 3 0112 4 1002 下标 1、2 和 4 在其二进制表示中都存在 k 1 个置位。 因此&#xff0c;答案为 nums[1] nums[…...

Redis 教程

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。 Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 它通常被称为数据结构服务器&…...

2024 CVPR Highlight Learning-Feedback

图像增强 Towards Robust Event-guided Low-Light Image Enhancement: A Large-Scale Real-World Event-Image Dataset and Novel Approach 解决的主要问题是低光照条件下的图像增强 通过多尺度整体融合分支提取事件和图像的结构和纹理信息&#xff0c;并引入信噪比&#xff0…...

maven、npm、pip、yum官方镜像修改文档

文章目录 Maven阿里云网易华为腾讯云 Npm淘宝腾讯云 pip清华源阿里中科大华科 Yum 由于各博客繁杂&#xff0c;本文旨在记录各常见镜像官网&#xff0c;及其配置文档。常用镜像及配置可评论后加入 Maven 阿里云 官方文档 setting.xml <mirror><id>aliyunmaven&l…...