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

【C++高并发服务器WebServer】-1:Linux中父子进程fork创建及关系、GDB多进程调试

在这里插入图片描述

本文目录

  • 一、进程创建
  • 二、GDB多进程调试

一、进程创建

在Linux中输入man 2 fork可以查看man文档中的fork的相关函数信息。

fork的作用就是创建一个子进程。

在这里插入图片描述

通过fork我们可以知道,创建子进程的时候,复制父进程的信息。

我们看看翻译的man文档信息:

  • 子进程和父进程在独立的内存空间中运行。在调用 fork() 时,两个内存空间的内容是相同的。其中一个进程进行的写操作、文件映射以及取消映射不会影响另一个进程。

首先我们来说说,在 fork() 调用时,子进程和父进程的内存空间内容是相同的,这是因为 fork() 的实现机制是通过“写时复制”(Copy-On-Write,简称 COW)来实现的。

  • 内存空间的复制

首先,fork() 的目标是创建一个与父进程几乎完全相同的子进程。为此,它需要复制父进程的内存空间,包括代码段、数据段、堆和栈等。在调用 fork() 的瞬间,子进程的内存空间内容与父进程完全一致。当然,上面两句话指的是虚拟地址空间。

在 fork() 后,父子进程会有相同的虚拟地址空间映射,父进程的数据和堆栈的内容在物理内存中不会立即复制。实际上,操作系统使用了页表(paging)来标记这些内存页面为只读,且标记为共享的。

  • 写时复制(Copy-On-Write)机制

虽然内存空间的内容在 fork() 时是相同的,但实际的物理内存并没有完全复制。操作系统采用了“写时复制”技术来优化资源使用。

在 fork() 调用后,父进程和子进程共享相同的物理内存页面。只有当父进程或子进程中的任意一个对内存进行写操作时,操作系统才会真正复制该页面的内容到一个新的物理页面,并将修改后的页面分配给进行写操作的进程。如果父进程和子进程都没有对内存进行写操作,它们将继续共享相同的物理页面。

当父进程或子进程尝试修改某一共享的内存页时,操作系统才会进行实际的物理内存复制。这意味着只有在进程写入某个页面时,内核才会为该页面分配新的物理内存,并将原页面的内容复制到新的物理内存位置,从而保证父子进程的内存内容互不影响。

所以由于 fork() 的目标是创建一个与父进程完全相同的子进程,因此在调用 fork() 的瞬间,子进程的内存空间内容必须与父进程一致。这是通过逻辑上的“复制”实现的(虚拟地址空间),而物理内存的实际复制则通过写时复制机制延迟到真正需要修改内存时才进行。

  • “运行在不同的内存空间”(The child process and the parent process run in separate memory spaces)

这句话的核心在于“内存空间”(memory space)的概念。内存空间指的是进程的虚拟内存空间(virtual memory space),而不是物理内存(physical memory)。每个进程都有自己的虚拟内存空间,这是操作系统为进程分配的逻辑地址空间。虚拟内存空间是独立的,每个进程都无法直接访问其他进程的虚拟内存空间。这种隔离是现代操作系统实现进程隔离和保护的基础。

当 fork() 创建子进程时,子进程会获得一个全新的虚拟内存空间。虽然这个虚拟内存空间的内容在创建时与父进程的虚拟内存空间内容相同,但它们是完全独立的。子进程无法直接访问父进程的虚拟内存空间,反之亦然。

虽然父进程和子进程运行在不同的虚拟内存空间中,但它们的内存内容在 fork() 调用时是相同的。一是因为逻辑上的复制:在 fork() 调用时,子进程的虚拟内存空间被初始化为与父进程的虚拟内存空间内容一致。这意味着子进程的代码段、数据段、堆和栈等在逻辑上与父进程相同。

二是因为写时复制(Copy-On-Write):操作系统通过写时复制技术优化了内存的使用。虽然虚拟内存空间的内容在逻辑上是相同的,但物理内存页面并不会立即复制。只有当父进程或子进程对某个页面进行写操作时,操作系统才会真正复制该页面的内容到新的物理内存中。所以只需要明确:在 fork() 调用时,子进程的虚拟内存空间的内容与父进程相同,但这种相同是逻辑上的,物理内存的复制是通过写时复制机制实现的。

在linux中新建c++文件,运行下面代码,gcc fork.c -o fork./fork

/*pid_t fork(void):作用:创建子进程。返回值;fork会返回两次:一次在父进程中,一次在子进程中。在父进程中,返回子进程的ID;在子进程中,返回0.如何区分父进程和子进程,就可以通过fork返回值。如果在父进程中返回-1,表示创建子进程失败,并且设置对应的error(当系统的进程数达到了系统上限或者内存不足的时候,就会失败)*/# include<sys/types.h>
# include<unistd.h>
# include<stdio.h>
int main(){pid_t pid = fork(); //这个pid是int类型的//因为fork会返回两个,分别对应两个进程//判断是父进程还是子进程if (pid>0){printf("pid: %d\n", pid);printf("我是父进程,pid : %d,ppid: %d\n",getpid(),getppid());}else if(pid==0){printf("我是子进程,pid : %d,ppid: %d\n",getpid(),getppid());}for(int i=0;i<5;i++){printf("i : %d, pid : %d \n",i,getpid());sleep(1);}return 0;
}

输出如下:

当前的pid是fork程序33228,ppid是32535(这个是我的连接linux终端bash的进程id,然后子进程id是33228,能够对应上。)

pid: 33228
我是父进程,pid : 33227,ppid: 32535
i : 0, pid : 33227 
我是子进程,pid : 33228,ppid: 33227
i : 0, pid : 33228 
i : 1, pid : 33227 
i : 1, pid : 33228 
i : 2, pid : 33227 
i : 2, pid : 33228 
i : 3, pid : 33227 
i : 3, pid : 33228 
i : 4, pid : 33228 
i : 4, pid : 33227 

从上面也可以看出,是父进程和子进程交替在运行for循环,从这一点也可以看出cpu是时间片分给父子进程交替运行。

并且父子进程都在运行for,也可以看出父子进程共享了代码。

下图是父子进程虚拟地址空间示意图,fork以后,子进程的用户区数据和父进程一样(因为是拷贝过来的),内核区也会拷贝过来,但是内核区的pid不一样。

父进程执行 pid_t pid = fork() 得到的返回值,是在栈空间,得到的返回值是子进程的pid(比如33228),但是子进程clone得到的虚拟地址空间中的栈空间所得到的pid是0,但是linux内核中子进程的pid是33228(注意返回的id和自身的pid)。
在这里插入图片描述

虚拟地址空间(Virtual Address Space)是现代计算机操作系统中一个非常重要的概念,它是操作系统为每个进程分配的逻辑地址空间。简单来说,虚拟地址空间是一个进程能够访问的内存地址范围,但这些地址并不是直接映射到物理内存(实际的硬件内存)的地址,而是通过操作系统和硬件的联合管理,映射到物理内存或其他存储资源的逻辑地址。
虚拟地址空间通常由以下几部分组成:
代码段(Code Segment):存放程序的可执行代码。
数据段(Data Segment):存放程序的全局变量和静态变量。
堆(Heap):用于动态分配内存(如通过 malloc() 或 new 分配的内存)。
栈(Stack):用于存储函数调用时的局部变量、函数参数和返回地址等。
共享库(Shared Libraries):存放程序运行时加载的动态链接库(如 .so 文件)。
未映射区域(Unmapped Regions):未分配给任何用途的内存区域,通常用于未来扩展。
虚拟地址空间是现代操作系统实现内存管理、进程隔离和内存保护的核心机制。它使得每个进程都能在一个独立的、安全的环境中运行,同时允许操作系统灵活地管理物理内存资源。
简单来说,虚拟地址空间是一个进程的“私有内存世界”,它通过操作系统和硬件的支持,将逻辑地址与物理地址分离,从而实现高效的内存管理和进程隔离。

所以总结一下就是:内核此时并不复制整个进程的地址空间,而是让父子进程共享同一个地址空间,只要需要写入的时候才会复制地址空间,从而使得各个进程拥有各自的地址空间,也就是说,资源的复制是在写入的时候才会进行(读时共享,写时拷贝)。fork产生的子进程与父进程相同的文件描述符指向相同的文件夹,且用户区的数据相同。

二、GDB多进程调试

使用GDB进行调试的时候, 默认只能跟踪一个进程,可以在fork函数调用之前,通过指令设置GDB调试工具跟踪父进程或者跟踪子进程,默认跟踪父进程。

set follow-fork-mode [parent(默认)|child] 命令是设置调试父进程或者子进程。

设置调试模式:`set detach-on-fork [on|off],默认为on,表示调试当前进程的时候其他进程继续运行,如果为off,则调试当前进程的时候,其他进程被GDB挂起。

查看调试的进程:info inferiors, 切换当前调试的进程:inferior id,使进程脱离GDB调试:detech inferiors id

# include<sys/types.h>
# include<unistd.h>
# include<stdio.h>
int main(){printf("begin\n");//判断是父进程还是子进程if (fork()>0){printf("我是父进程,pid : %d,ppid: %d\n",getpid(),getppid());int i;for(i=0;i<10;i++){printf("i=%d\n",i);sleep(1);}}else{printf("我是子进程,pid : %d,ppid: %d\n",getpid(),getppid());int j;for(j=0;j<10;j++){printf("i=%d\n",j);sleep(1);}}return 0;
}

输入命令进行编译调试:gcc hello.c -o hello -g,然后通过gdb hello进行调试。

在12行、19行插入断点。

在这里插入图片描述
在这里插入图片描述
然后输入r、n(next)、n,就会发现下面的调试过程,也就是gdb默认调试父进程,然后子进程的代码会走掉。

在这里插入图片描述
在gdb环境下,通过命令show follow-fork-mode可以查看现有的fork模式,我们通过set follow-fork-mode child来跟踪子进程。

这个时候再继续run,就会发现断点在19行停住了。
在这里插入图片描述
通过info inferiors可以查看调试进程,并且inferior 2切换调试的进程。
在这里插入图片描述

相关文章:

【C++高并发服务器WebServer】-1:Linux中父子进程fork创建及关系、GDB多进程调试

本文目录 一、进程创建二、GDB多进程调试 一、进程创建 在Linux中输入man 2 fork可以查看man文档中的fork的相关函数信息。 fork的作用就是创建一个子进程。 通过fork我们可以知道&#xff0c;创建子进程的时候&#xff0c;复制父进程的信息。 我们看看翻译的man文档信息&am…...

leetcode——相交链表(java)

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…...

Spring 框架:配置缓存管理器、注解参数与过期时间

在 Spring 框架中&#xff0c;可通过多种方式配置缓存具体行为&#xff0c;常见配置方法如下。 1. 缓存管理器&#xff08;CacheManager&#xff09;配置 基于内存的缓存管理器配置&#xff08;以SimpleCacheManager为例&#xff09; SimpleCacheManager 是 Spring 提供的简单…...

UDP協議與代理IP介紹

UDP&#xff0c;全稱是用戶數據報協議&#xff08;User Datagram Protocol&#xff09;&#xff0c;是Internet協議套組的一部分&#xff0c;與TCP協議一道工作。與TCP相比&#xff0c;UDP可以理解為一個更“羽量級”的協議。它不需要像TCP那樣在數據傳輸開始之前建立連接&…...

24.日常算法

1. 数组中两元素的最大乘积 题目来源 给你一个整数数组 nums&#xff0c;请你选择数组的两个不同下标 i 和 j&#xff0c;使 (nums[i]-1)*(nums[j]-1) 取得最大值。请你计算并返回该式的最大值。 示例 1&#xff1a; 输入&#xff1a;nums [3,4,5,2] 输出&#xff1a;12 解释…...

【Python】FastAPI框架快速实现后端(一)

FastAPI框架快速实现后端-SQLModel的使用 介绍正文基础模型模型与表定义数据表模型关系定义 介绍 最近1个多月&#xff0c;用FastAPI做了几个日常工作用的小功能&#xff0c;感觉FastAPI确实很适合这种场景&#xff0c;功能要求简单&#xff0c;交付要求比较急&#xff0c;这个…...

西门子【Library of General Functions (LGF) for SIMATIC S7-1200 / S7-1500】

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 通用函数库 (LGF) 扩展了 TIA Portal 中用于 PLC 编程的 STEP 7 指令&#xff08;数学函数、时间、计数器 等&#xff09;。该库可以不受限制地使用&#xff0c;并包含 FIFO 、搜索功能、矩阵计算、 astro 计…...

年度总结和寒假总结

年度总结 加入Hope实验室 年初&#xff0c;我加入了Hope实验室&#xff0c;在实验室里&#xff0c;我接触到了更加前沿的技术和项目。刚开始时&#xff0c;我主要学习了Java语言和MySQL数据库。这是我第一次系统地接触这些技术&#xff0c;相比之前的课堂学习&#xff0c;实验…...

STM32 GPIO配置 点亮LED灯

本次是基于STM32F407ZET6做一个GPIO配置&#xff0c;实现点灯实验。 新建文件 LED.c、LED.h文件&#xff0c;将其封装到Driver文件中。 双击Driver文件将LED.c添加进来 编写头文件&#xff0c;这里注意需要将Driver头文件声明一下。 在LED.c、main.c里面引入头文件LED.h LED初…...

C#标准Mes接口框架(持续更新)

前言 由于近期我做了好几个客户的接入工厂Mes系统的需求。但是每个客户的Mes都有不同程度的定制需求&#xff0c;原有的代码复用难度其实很大。所以打算将整个接入Mes系统的框架单独拿出来作为一个项目使用&#xff0c;同时因为不同的设备接入同一个Mes系统&#xff0c;所以代…...

22_设计方案(4.1.7)

4.1.7 数据组织存储实例 全区所有数据库信息根据业务使用范围存储在互联网区、政务外网区、自然资源业务网区的服务器。互联网区的服务器主要存储互联网数据库。政务外网区的服务器主要存储全区所有市、县(区)不动产登记业务库、档案库、后台管理库、工作流库,全区共享查询…...

Ansys Thermal Desktop 概述

介绍 Thermal Desktop 是一种用于热分析和流体分析的通用工具。它可用于组件或系统级分析。 来源&#xff1a;CRTech 历史 Thermal Desktop 由 C&R Technologies (CR Tech) 开发。它采用了 SINDA/FLUINT 求解器。SINDA/FLUINT 最初由 CR Tech 的创始人为 NASA 的约翰逊航…...

PageView组件的功能和用法

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了如何屏蔽事件关的内容,本章回中将介绍PageView Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的PageView是指左右滑动或者上下滑动显示不同的页面&#xff0c;Flutter把它…...

自动化实现的思路变化

阶段一&#xff1a; 1、成功调用。第一步&#xff0c;一般是用现用的工具&#xff0c;或者脚本成功调用接口 2、解决关联接口的参数传递。有的接口直接&#xff0c;存在参数的传递&#xff0c;一般的思路&#xff0c;就是将这个参数设置为变量。 3、简化代码。总会有些东西是重…...

微信小程序启动小程序APP Page Component创建顺序

之前之后的打印 都是在&#xff08;&#xff09;之外...

从 UTC 日期时间字符串获取 Unix 时间戳:C 和 C++ 中的挑战与解决方案

在编程世界里&#xff0c;从 UTC 日期时间字符串获取 Unix 时间戳&#xff0c;看似简单&#xff0c;实则暗藏玄机。你以为输入一个像 “Fri, 17 Jan 2025 06:07:07” 这样的 UTC 时间&#xff0c;然后轻松得到 1737094027&#xff08;从 1970 年 1 月 1 日 00:00:00 UTC 开始经…...

[Spring] Gateway详解

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

计数排序算法

基本思想 先确定待排序数组的最大值&#xff08;Max&#xff09;和最小值&#xff08;Min&#xff09;&#xff0c;随后创建Max - Min 1个长度的数组称为计数数组&#xff0c;计数数组的索引对应着待排序数组中元素的值&#xff0c;数组的值表示该元素的出现次数。通过从前往…...

Spring--基于注解的声明式事务

基于注解的声明式事务 1.选择一个合适的事务管理器实现加入到ioc容器 2.使用注解指定哪些方法需要添加事务即可 1.事务属性&#xff1a;只读 // readOnly true把当前事务设置为只读 默认是false! Transactional(readOnly true)Transactional注解放在类上 生效原则 如果一…...

SQL-leetcode—1164. 指定日期的产品价格

1164. 指定日期的产品价格 产品数据表: Products ---------------------- | Column Name | Type | ---------------------- | product_id | int | | new_price | int | | change_date | date | ---------------------- (product_id, change_date) 是此表的主键&#xff08;具…...

微服务搭建----springboot接入Nacos2.x

springboot接入Nacos2.x nacos之前用的版本是1.0的&#xff0c;现在重新搭建一个2.0版本的&#xff0c;学如逆水行舟&#xff0c;不进则退&#xff0c;废话不多说&#xff0c;开搞 1、 nacos2.x搭建 1&#xff0c;首先第一步查询下项目之间的版本对照&#xff0c;不然后期会…...

JavaEE:多线程进阶

JavaEE&#xff1a;多线程进阶 一、对比不同锁策略之间的应用场景及其区别1. 悲观锁 和 乐观锁1.1 定义和原理1.2 应用场景1.3 示例代码 2. 重量级锁 和 轻量级锁2.1 定义和原理2.2 应用场景2.3 示例代码 3. 挂起等待锁 和 自旋锁3.1 定义和原理3.2 应用场景3.3 示例代码 4. 几…...

软件测试 —— jmeter(2)

软件测试 —— jmeter&#xff08;2&#xff09; HTTP默认请求头&#xff08;元件&#xff09;元件作用域和取样器作用域HTTP Cookie管理器同步定时器jmeter插件梯度压测线程组&#xff08;Stepping Thread Group&#xff09;参数解析总结 Response Times over TimeActive Thre…...

[java] 面向对象进阶篇1--黑马程序员

目录 static 静态变量及其访问 实例变量及其访问 静态方法及其访问 实例方法及其访问 总结 继承 作用 定义格式 示例 总结 子类不能继承的内容 继承后的特点 成员变量 成员变量不重名 成员变量重名 super访问父类成员变量 成员方法 成员方法不重名 成员方法…...

openstack单机安装

openstack单机安装 网卡配置安装依赖开启虚拟环境修改配置文件 部署openstack部署openstack客户端访问可视化界面Horizon补充 本篇主要讲述Ubuntu2204单机安装openstackstable/2024.2。其他版本的Linux系统或者openstack版本&#xff0c;请参考openstack官网。 网卡配置 需要配…...

OFD、PDF 电子签章系统处理流程

在C#中实现电子签章系统的处理流程&#xff0c;可以参考以下步骤和技术实现&#xff1a; 1. 电子签章系统的基本流程 电子签章系统的核心流程包括以下几个步骤&#xff1a; 密钥生成&#xff1a;生成公钥和私钥对&#xff0c;私钥由签章人保管&#xff0c;公钥用于验证签名。…...

「 机器人 」系统辨识实验浅谈

前言 系统辨识实验是一种通过实验和数据分析的方法,用于建立物理系统的数学模型的技术。系统辨识是控制工程和系统科学中的重要环节,尤其是在模型未知或复杂的情况下。以下是系统辨识实验的详细介绍: 1. 系统辨识实验的目的 1.1 建模 为动态系统(如机械系统、电气系统或生…...

15.7k!DISM++一款快捷的系统优化工具

软件介绍 链接 软件介绍 dism是一款由初雨团队开发的win系统优化工具&#xff0c;可当作是微软系统命令行工具dism的GUI版本。可用作系统垃圾清除、启动项管理、程序卸载、驱动管理、系统优化等 该工具个人感觉最重要的就是系统优化选项&#xff0c;它将一些实用、无用或者没…...

Windows10安装MySQL找不到MSVCR120.dll和MSVCP120.dll问题解决

个人博客地址&#xff1a;Windows10安装MySQL找不到MSVCR120.dll和MSVCP120.dll问题解决 | 一张假钞的真实世界 msvcp120.dll、msvcr120.dll、vcomp120.dll属于VC2013版中的动态链接库&#xff0c;如果丢失重新安装VC2013即可。下载地址&#xff1a;https://www.microsoft.com…...

Vue 3 30天精进之旅:Day 03 - Vue实例

引言 在前两天的学习中&#xff0c;我们成功搭建了Vue.js的开发环境&#xff0c;并创建了我们的第一个Vue项目。今天&#xff0c;我们将深入了解Vue的核心概念之一——Vue实例。通过学习Vue实例&#xff0c;你将理解Vue的基础架构&#xff0c;掌握数据绑定、模板语法和指令的使…...

被遮挡QT窗口置顶

问题描述 开发环境&#xff1a;windows QT 需求&#xff1a; 单击托盘将桌面窗口在被遮挡的情况下置顶解决方案 方案1 资料链接 代码实现 Qt::WindowFlags flags windowFlags(); this->setWindowFlags((flags | Qt::WindowStaysOnTopHint)); this->showMaximized();…...

Apache Flink 概述学习笔记

一、引言 在大数据处理领域&#xff0c;Apache Flink 是一个极具影响力的开源流批一体化计算框架&#xff0c;它以其独特的架构和强大的功能&#xff0c;为大规模数据处理提供了高效、灵活的解决方案。 二、基本概念 Flink 是什么&#xff1a;Flink 是一个分布式流批处理框架…...

系统思考—复杂问题的根源分析

在企业中&#xff0c;许多问题看似简单&#xff0c;背后却潜藏着复杂的因果关系。传统的思维方式往往只能看到表面&#xff0c;而无法深入挖掘问题的真正根源。我们常常通过“表面解决”来应对眼前的症状&#xff0c;但这往往只是治标不治本。 比如&#xff0c;销量下降时&…...

Python 之 Excel 表格常用操作

示例文件 test.xlsx 将各个表单拆分成单独的 Excel 文件 import os.pathimport openpyxl import pandasdef handle_excel(file_path):dirname os.path.dirname(file_path)basename os.path.basename(file_path).split(".")[0]wb openpyxl.load_workbook(file_pat…...

《用DOTS解决实际需求》集锦

去年作者发布了一篇《DOTS-ECS系列课程》&#xff0c;深受同学们的好评&#xff01;前期课程是基于0.51版本录制的&#xff0c;DOTS升级至1.0版本后&#xff0c;同学们纷纷希望能使用DOTS 1.0版本录制实战课程。 今年作者带着DOTS 1.0版本的实战课程回来啦&#xff01;&#x…...

【MySQL】存储引擎有哪些?区别是什么?

频率难度60%⭐⭐⭐⭐ 这个问题其实难度并不是很大&#xff0c;只是涉及到的相关知识比较繁杂&#xff0c;比如事务、锁机制等等&#xff0c;都和存储引擎有关系。有时还会根据场景选择不同的存储引擎。 下面笔者将会根据几个部分尽可能地讲清楚 MySQL 中的存储引擎&#xff0…...

ios打包:uuid与udid

ios的uuid与udid混乱的网上信息 新人开发ios&#xff0c;发现uuid和udid在网上有很多帖子里是混淆的&#xff0c;比如百度下&#xff0c;就会说&#xff1a; 在iOS中使用UUID&#xff08;通用唯一识别码&#xff09;作为永久签名&#xff0c;通常是指生成一个唯一标识&#xf…...

Jadx动态调试安卓逆向

adb shell su ls 找到default.prop cat default.prop ro.debuggable0(代表没有调试权限) adb shell getprop ro.debuggable # 检查设备是否可调试&#xff08;1可调试&#xff09; adb shell getprop ro.product.cpu.abi # 获取设备 CPU 架构&#xff08;如 arm64-v…...

在Ubuntu上使用Apache+MariaDB安装部署Nextcloud并修改默认存储路径

一、前言 Nextcloud 是一款开源的私有云存储解决方案&#xff0c;允许用户轻松搭建自己的云服务。它不仅支持文件存储和共享&#xff0c;还提供了日历、联系人、任务管理、笔记等丰富的功能。本文将详细介绍如何在 Ubuntu 22.04 LTS 上使用 Apache 和 MariaDB 安装部署 Nextcl…...

FPGA实现任意角度视频旋转(二)视频90度/270度无裁剪旋转

本文主要介绍如何基于FPGA实现视频的90度/270度无裁剪旋转&#xff0c;关于视频180度实时旋转&#xff0c;请见本专栏前面的文章&#xff0c;旋转效果示意图如下&#xff1a; 为了实时对比旋转效果&#xff0c;采用分屏显示进行处理&#xff0c;左边代表旋转前的视频在屏幕中…...

六、深入了解DI

依赖注入是⼀个过程&#xff0c;是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源&#xff0c;⽽资源指的就是对象. 在上⾯程序案例中&#xff0c;我们使⽤了 Autowired 这个注解&#xff0c;完成了依赖注⼊的操作. 简单来说,就是把对象取出来放到某个类的属性中。 关于依赖注…...

kotlin内联函数——let,run,apply,also,with的区别

一、概述 为了帮助您根据使用场景选择合适的作用域函数&#xff08;scope function&#xff09;&#xff0c;我们将对它们进行详细描述并提供使用建议。从技术上讲&#xff0c;许多情况下范围函数是可以互换使用的&#xff0c;因此示例中展示了使用它们的约定俗成的做法。 1.…...

火语言RPA—超级鹰打码

&#x1f6a9;【组件功能】&#xff1a;通过传入图像返回图像中的文字或结果信息 针对不同类型图片形式的验证码&#xff0c;提交至平台api&#xff0c;以字符串形式返回图片识别结果。 配置预览 配置说明 文件路径 支持T或# 默认FLOW输入项 待识别本地图片的完整路径。 用…...

C#新语法

目录 顶级语句&#xff08;C#9.0&#xff09; using 全局using指令&#xff08;C#10.0&#xff09; using资源管理问题 using声明&#xff08;C#8.0&#xff09; using声明陷阱 错误写法 正确写法 文件范围的命名空间声明&#xff08;C#10.0&#xff09; 可空引用类型…...

Cloudflare通过代理服务器绕过 CORS 限制:原理、实现场景解析

第一部分&#xff1a;问题背景 1.1 错误现象复现 // 浏览器控制台报错示例 Access to fetch at https://chat.qwenlm.ai/api/v1/files/ from origin https://ocr.doublefenzhuan.me has been blocked by CORS policy: Response to preflight request doesnt pass access con…...

lightgbm做分类

python import pandas as pd#导入csv文件的库 import numpy as np#进行矩阵运算的库 import json#用于读取和写入json数据格式#model lgb分类模型,日志评估,早停防止过拟合 from lightgbm import LGBMClassifier,log_evaluation,early_stopping #metric from sklearn.metrics …...

下载Visual Studio Community 2019

官方链接如下&#xff1a;Visual Studio Community 2019下载链接 https://learn.microsoft.com/zh-cn/visualstudio/releases/2019/system-requirements#download 目前官方仅建议2022版&#xff0c;已经关闭vs2019等旧版本&#xff0c;哪天开放了&#xff0c;记得踢我一下。 …...

深入理解MySQL事务(万字详)

文章目录 什么是事务为什么会出现事务事务的版本支持事务的提交方式事务常见操作方式正常演示 - 证明事务的开始与回滚非正常演示1 - 证明未commit&#xff0c;客户端崩溃&#xff0c;MySQL自动会回滚&#xff08;隔离级别设置为读未提交&#xff09;非正常演示2 - 证明commit了…...

FFPlay命令全集合

FFPlay是以FFmpeg框架为基础&#xff0c;外加渲染音视频的库libSDL构建的媒体文件播放器。 ffplay工具下载并播放视频&#xff0c;可以辅助卡看流信息。 官网下载地址&#xff1a;http://ffmpeg.org/download.html#build-windows 下载build好的exe程序&#xff1a; 此处下载…...

AI编程工具使用技巧:在Visual Studio Code中高效利用阿里云通义灵码

AI编程工具使用技巧&#xff1a;在Visual Studio Code中高效利用阿里云通义灵码 前言一、通义灵码介绍1.1 通义灵码简介1.2 主要功能1.3 版本选择1.4 支持环境 二、Visual Studio Code介绍1.1 VS Code简介1.2 主要特点 三、安装VsCode3.1下载VsCode3.2.安装VsCode3.3 打开VsCod…...