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

【第14节】windows sdk编程:进程与线程介绍

目录

一、进程与线程概述

1.1 进程查看

1.2 何为进程

1.3 进程的创建

1.4 进程创建实例

1.5 线程查看

1.6 何为线程

1.7 线程的创建

1.8 线程函数

1.9 线程实例

二、内核对象

2.1 何为内核对象

2.2 内核对象的公共特点

2.3 内核对象句柄

2.4 内核对象的跨进程访问


一、进程与线程概述

1.1 进程查看

方法1
        在屏幕底部的任务栏上右击鼠标,从弹出的快捷菜单中选择“任务管理器”,随后任务管理器窗口将会打开,您便可以在其中浏览当前运行的进程。

方法2
        点击开始菜单,在搜索栏中输入“cmd”并打开命令提示符,然后在命令提示符中输入“tasklist”命令来查看当前运行的进程。

方法3
        在命令提示符中,首先键入“wmic”并按下回车,接着输入“process”来查看进程信息。

1.2 何为进程

        进程是指一个正在运行的程序实例。它最早在20世纪60年代由麻省理工学院和IBM公司的CTSS/360系统引入,并成为操作系统结构的基础。进程是操作系统进行资源分配和调度的基本单位,代表程序在数据集上的执行过程。一个程序可能同时属于多个进程。

        进程本身并不执行代码,而是作为线程的容器。每个进程在创建时都会生成一个主线程来执行代码。如果主线程结束,系统会销毁该进程的内核对象。

        进程可以分为系统进程和用户进程。系统进程负责完成操作系统的各种功能,相当于运行状态下的操作系统本身;用户进程则是由用户启动的程序实例。

        在Windows系统中,进程进一步细分为线程,一个进程可以包含多个独立运行的线程。与静止的程序不同,进程是动态的。为了描述多任务操作系统中多道程序并发执行时的资源分配、程序执行的间断性、通信可能性以及同步互斥等动态特性,引入了进程的概念来参与系统的并发执行。

1.3 进程的创建

CreateProcess()函数可以用来创建一个进程,原型如下所示:

BOOL WINAPI CreateProcess(_In_opt_ LPCTSTR lpApplicationName, //可执行文件名_Inout_opt  LPTSTR lpCommandLine,  //命令行_In_opt_  LPSECURITY_ATTRIBUTES  lpProcessAttributes,_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,_In       BOOL  bInheritHandles,      //句柄继承是否_In       DWORD  dwCreationFlags,     //创建方式标志_In_opt   LPVOID   lpEnvironment,     //环境字符串块_In_opt   LPCTSTR lpCurrentDirectory, //新进程的当前目录_In       LPSTARTUPINFO lpStartupInfo, //进程配置结构体_Out_     LPPROCESS_INFORMATION lpProcessInformation
);


        此函数执行成功后将创建一个进程内核对象,但需要注意的是,“进程内核对象”与“进程”所指的并非是同一个东西。因此,CreateProcess()函数可以创建成功并不代表进程本身就能正常加载并运行。

更详细的参数解释:
- `lpApplicationName`:要执行的可执行文件名称。
- `lpCommandLine`:传递给新进程的命令行字符串,需要注意的是,此参数类型为PTSTR,这意味着CreateProces()在执行过程中可能会修改我们传入的值。
- `lpProcessAttributes`:进程安全属性,这些都属于内核对象。
- `lpThreadAttributes`:线程安全属性。
- `bInheritHandles`:表示新创建的子进程是否继承父进程中的所有句柄,是的话子进程就可以访问父进程中创建的所有句柄。
- `dwCreationFlags`:子进程的创建方式。
- `lpEnvironment`:指向保存有进程环境字符串的内存块。
- `lpCurrentDirectory`:新创建子进程的当前目录。
- `lpStartupInfo`:指向子进程创建配置结构体,此结构可以详细控制子进程的各种创建状态。
- `lpProcessInformation`:返回进程创建的详细信息。

1.4 进程创建实例

bool CreateChildProcess(LPWSTR lpPath, BOOL bWait) {// 初始化 STARTUPINFO 结构体,设置其大小为结构体本身的大小STARTUPINFO si = {0};si.cb = sizeof(si);// 初始化 PROCESS_INFORMATION 结构体,用于接收新进程的信息PROCESS_INFORMATION pi = {0};// 尝试创建子进程if (!CreateProcess(lpPath,   // 可执行文件的路径NULL,     // 命令行参数(未使用)NULL,     // 进程句柄不可继承NULL,     // 线程句柄不可继承FALSE,    // 不继承句柄0,        // 无特殊标志NULL,     // 使用父进程的环境变量NULL,     // 使用父进程的当前目录&si,      // 指向 STARTUPINFO 结构体&pi)) {   // 指向 PROCESS_INFORMATION 结构体// 如果创建进程失败,返回 falsereturn false;}// 如果需要等待子进程执行结束if (bWait) {// 无限等待子进程结束WaitForSingleObject(pi.hProcess, INFINITE);}// 关闭进程句柄CloseHandle(pi.hProcess);// 关闭线程句柄CloseHandle(pi.hThread);// 返回 true 表示成功创建子进程return true;
}

1.5 线程查看

        使用PCHunter或者火绒剑工具可以查看指定进程的线程及线程的信息。

1.6 何为线程

        线程是操作系统中的一个内核对象。在Windows操作系统的内核中,并没有进程的概念,只有线程的概念。进程实际上是从逻辑上对一组线程及其相关资源进行的整合。

        线程是“进程”中的一个单一顺序的控制流,也被称为轻量级进程(lightweight processes),是程序运行时的调度单位。一个线程可以创建多个子线程,而这些子线程又可以继续创建更多的线程。

        从资源占用的角度来看,线程所需的系统资源远远少于进程,但它在功能实现上并不逊色。因此,在开发项目时,应优先考虑创建新的线程,而不是启动一个新的进程。

1.7 线程的创建

创建线程的函数原型如下:

HANDLE WINAPI CreateThread(_In_opt_  LPSECURITY_ATTRIBUTES lpThreadAttributes,_In_      SIZE_T                dwStackSize,  //栈大小,默认1MB_In_       LPTHREAD_START_ROUTINE lpStartAddress, //不能为0_In_opt_  LPVOID                lpParameter,_In_      DWORD                 dwCreationFlags,_Out_opt_ LPDWORD               lpThreadId
);


参数解释:
- `dwStackSize`:指定线程可以拥有多少栈,属于线程。
- `lpStartAddress`:线程函数起始地址。
- `lpParameter`:线程函数参数。
- `dwCreationFlags`:线程创建标记。
- `lpThreadId`:新创建线程的ID。

1.8 线程函数

        像主线程的初始函数为mainCRTStartup/wmainCRTStartup一样,我们创建线程时也需要指定一个线程函数。为了取得一致性,Windows对线程函数做了限定,其原型如下所示:

DWORD WINAPI ThreadProc(LPVOID lpParam) {return 0;
}

        就像线程可指定线程函数一样,主线程同样可以指定自己的线程函数,在VisualStudio下,可以通过以下编译选项指定主线程函数:

//指定程序入口函数为MyFun()
#pragma comment(linker,"/entry:\"MyFun\"")

1.9 线程实例

// 线程函数,显示一个消息框
DWORD WINAPI ThreadProc(LPVOID lpParam) {// 显示消息框MessageBox(NULL, (LPCWSTR)lpParam, L"CreateThread", MB_OK);return 0; // 线程正常退出
}// 创建子线程的函数
bool CreateChildThread() {DWORD dwThreadId = 0; // 用于保存线程IDHANDLE hThread = CreateThread(NULL,          // 默认安全属性0,             // 默认堆栈大小ThreadProc,    // 线程函数(LPVOID)L"Hello from the new thread!", // 传递给线程的参数0,             // 默认创建标志&dwThreadId);  // 返回线程ID// 检查线程是否创建成功if (hThread == NULL) {std::cerr << "CreateThread failed: " << GetLastError() << std::endl;return false; // 创建线程失败,返回false}// 关闭线程句柄,避免资源泄漏CloseHandle(hThread);std::cout << "子线程创建成功,线程ID: " << dwThreadId << std::endl;return true; // 创建线程成功,返回true
}

二、内核对象

2.1 何为内核对象

        Windows操作系统虽然是用C语言和汇编语言编写的,但它是一个面向对象的操作系统,系统中广泛使用了对象的概念。例如,窗口、设备环境、代表DLL的模块、程序实例、文件、进程、画笔、画刷等都是对象。从本质上说,这些对象就是一个个结构体变量。然而,Windows系统不希望程序员直接定义、访问或修改这些结构体变量,因此它们被完全保护了起来。在使用这些对象时,都有一个共同点:必须先获取它们的句柄,然后通过调用相应的API来操作这些对象。

        简单来说,句柄就像是访问对象的“钥匙”,或者用程序员的话来说,句柄是对象的索引。

        根据对象的不同用途,Windows将对象分为多个类别,主要包括用户对象(user对象)、图形设备接口对象(GDI对象)和内核对象。其中,内核对象通常与系统的全局功能相关。

        常见的Windows内核对象包括:进程、线程、访问令牌、文件、文件映射、I/O完成端口、邮槽、管道、互斥体、信号量、事件、计时器和线程池等。

2.2 内核对象的公共特点

所有内核对象都遵循统一的使用模式:
(1)第一步:创建对象:创建一个内核对象,一般都是使用CreateXXX的方式,比如:
    - `CreateProcess`:创建进程。
    - `CreateThread`:创建线程。
    - `CreateFile`:创建文件。
    - `CreateFileMapping`:创建文件映射。
    - `CreateEvent`:创建事件对象。
    - `CreateSemaphore`:创建信号量。
(2)第二步:打开对象,得到句柄 (可与第一步合并在一起,表示创建的时后就打开)。
(3)第三步:通过API访问对象。
(4)第四步:关闭句柄。
(5)第五步:句柄全部关完,对象自动销毁。

        所有的内核对象都由操作系统内核管理,并且可以在不同进程之间访问,这就是所谓的“内核对象是跨进程的”。在许多情况下,我们需要在不同的进程中访问同一个内核对象,比如实现进程间的同步或共享数据。

        每个内核对象都有一个引用计数。可以理解为每个内核对象的结构体中都有一个字段用来记录引用计数。当一个进程创建或打开这个内核对象时,引用计数会增加1;当进程终止或关闭句柄时,引用计数会减少1。当引用计数减到0时,内核对象就会被销毁。

        举个例子,如果内核对象M由进程A创建,之后进程B也使用了这个对象,那么即使进程A退出了,M也不会被销毁,因为它仍然被进程B使用。只有当没有任何进程使用这个内核对象时,它才会被自动销毁。

        在创建内核对象时,每个对象都会有一个安全属性。这个安全属性定义了对象的使用方式,比如是否可读可写,以及对象具有的权限等。一旦内核对象以某种安全属性创建,它就只能在规定的权限范围内工作。通常,在创建内核对象时,我们需要指定一个`SECURITY_ATTRIBUTES`结构体来设置安全属性。如果传入`NULL`,系统会使用默认的安全属性。

2.3 内核对象句柄

        在Windows操作系统中,操作对象需要通过句柄来实现,内核对象也不例外。不过,内核对象的句柄是与进程相关的,这意味着同一个内核对象在不同进程中的句柄值是不同的。这一点与GDI对象不同,GDI对象的句柄值是全局有效的,不同进程可以使用相同的句柄值访问同一个GDI对象。由此可见,不同类型的对象在管理方式上存在差异。

        每个进程都有一个句柄表,用于记录该进程打开的所有内核对象。可以简单地把句柄表理解为一个一维的结构体数组,而句柄值就是这个数组中的索引。因此,内核对象的句柄值仅对当前进程有效。

        句柄表中的每一项不仅记录了通过该句柄访问内核对象的权限,还指明了该句柄是否可以被其子进程继承。

2.4 内核对象的跨进程访问

        要访问内核对象,进程的句柄表中必须有一个句柄项指向该内核对象。对于创建该内核对象的进程,句柄会直接插入到其句柄表中。而对于其他进程,通常有三种方式可以跨进程访问内核对象:

(1)父进程继承给子进程:当父进程创建子进程时,如果指定了句柄可继承的属性,子进程会继承父进程中所有可继承的句柄。需要注意的是,即使子进程继承了句柄,它也不知道具体继承了哪些句柄以及它们的值,这些信息只能由父进程通过进程间通信的方式传递给子进程。

(2)通过命名内核对象:在进程A中创建内核对象时,可以为该对象命名。进程B可以通过名称打开该内核对象。如果内核对象无法命名或没有唯一标识,则无法使用这种方式。

(3)使用`DuplicateHandle`函数:通过这个函数,可以将一个句柄从一个进程传递给另一个进程,从而在目标进程中获得源进程中内核对象的句柄。

        通常,获取内核对象句柄的方式有以下四种:
(1)创建对象:例如,使用`CreateFile`创建新文件时,会同时打开该文件对象并获得句柄。
(2)继承句柄:子进程继承父进程句柄表中的句柄。
(3)显式打开:例如,使用`OpenFile`、`OpenMutex`、`OpenProcess`等函数显式打开某个对象。
(4)`DuplicateHandle`:通过该函数间接打开对象并获得句柄。

        需要注意的是,句柄的概念可以理解为“具有指定权限和属性的访问句柄”。句柄代表对对象的一次打开操作,其权限决定了可以通过该句柄执行的操作。例如,如果打开文件时申请的权限是只读,那么即使当前用户拥有写权限,使用该句柄调用`WriteFile`也会被拒绝访问。

        句柄的属性中,一个重要特性是它是否可以被继承给子进程。

相关文章:

【第14节】windows sdk编程:进程与线程介绍

目录 一、进程与线程概述 1.1 进程查看 1.2 何为进程 1.3 进程的创建 1.4 进程创建实例 1.5 线程查看 1.6 何为线程 1.7 线程的创建 1.8 线程函数 1.9 线程实例 二、内核对象 2.1 何为内核对象 2.2 内核对象的公共特点 2.3 内核对象句柄 2.4 内核对象的跨进程访…...

实测 Gemini 2.0 Flash 图像生成:多模态 AI 的创作力边界

近日&#xff0c;Google 发布了 Gemini 2.0 Flash 的实验性图像生成功能&#xff08;Gemini 2.0 Flash (Image Generation) Experimental&#xff09;。我也第一时间体验了这一功能&#xff0c;再次感受到 AI 技术对传统图像处理工具的颠覆性冲击。 引言 Gemini 2.0 Flash 的…...

每日一题——买卖股票的最佳时机

买卖股票的最佳时机 问题描述示例示例 1示例 2 提示 问题分析难点分析 算法设计思路 代码实现复杂度分析测试用例测试用例 1测试用例 2测试用例 3 总结 问题描述 给定一个数组 prices&#xff0c;其中第 i 个元素 prices[i] 表示一支给定股票在第 i 天的价格。你可以选择某一天…...

以太坊节点间通信机制 DEVp2p 协议

文章目录 概要1. 协议概述2. 协议栈与关键技术3. RLPx 协议核心机制3.1 数据包结构3.2 加密握手流程 4. 核心子协议与消息类型4.1 基础控制消息4.2 以太坊子协议示例4.3 网络 ID 列表 5. 安全与防攻击机制6. 节点标识与声誉管理7. 对比其他区块链通信协议8. 总结 概要 1. 协议…...

YOLO+OpenCV强强联手:高精度跌倒检测技术实战解析

目录 关于摔倒检测 摔倒检测核心逻辑 摔倒检测:联合多种逻辑判断 原理详细解释 1. 导入必要的库 2. 定义函数和关键点连接关系 3. 筛选有效关键点并计算边界框 4. 计算人体上下半身中心点和角度 5. 绘制关键点和连接线 6. 绘制角度标注和检测跌倒 7. 返回处理后的图…...

HyperAD:学习弱监督音视频暴力检测在双曲空间中的方法

文章目录 速览摘要1. 引言2. 相关工作弱监督暴力检测双曲空间中的神经网络 3. 预备知识双曲几何切空间&#xff08;Tangent Space&#xff09;指数映射与对数映射&#xff08;Exponential and Logarithmic Maps&#xff09;3.1 双曲图卷积网络&#xff08;Hyperbolic Graph Con…...

网络协议抓取与分析(SSL Pinning突破)

1. 网络协议逆向基础 1.1 网络协议分析流程 graph TD A[抓包环境配置] --> B[流量捕获] B --> C{协议类型} C -->|HTTP| D[明文解析] C -->|HTTPS| E[SSL Pinning突破] D --> F[参数逆向] E --> F F --> G[协议重放与模拟] 1.1.1 关键分析目标…...

基于C#的以太网通讯实现:TcpClient异步通讯详解

基于C#的以太网通讯实现&#xff1a;TcpClient异步通讯详解 在现代工业控制和物联网应用中&#xff0c;以太网通讯是一种常见的数据传输方式。本文将介绍如何使用C#实现基于TCP协议的以太网通讯&#xff0c;并通过异步编程提高通讯效率。我们将使用TcpClient类来实现客户端与服…...

通过C#脚本更改材质球的参数

// 设置贴图Texture mTexture Resources.Load("myTexture", typeof(Texture )) as Texture;material.SetTexture("_MainTex", mTexture );// 设置整数material.SetInt("_Int", 1);// 设置浮点material.SetFloat("_Float", 0.1f);// 设…...

SpringBoot常用注解

SpringBoot常用注解 SpringBoot框架提供了丰富的注解&#xff0c;极大地简化了应用开发。本文将SpringBoot常用注解按功能分组&#xff0c;并提供详细说明和使用示例。 一、核心注解 1. SpringBootApplication 这是SpringBoot应用的核心注解&#xff0c;标记在主类上&#…...

Vim 编辑器复制文件所有内容

Vim 编辑器复制文件所有内容 在 Vim 的可视化模式下复制所有内容&#xff0c;可以通过以下步骤完成&#xff1a; 方法 1&#xff1a;可视化模式全选复制 进入可视化模式 按下 V&#xff08;大写 V&#xff09;进入 行可视化模式。 全选内容 依次按下 gg&#xff08;跳转到文件…...

MySQL 安全传输

Doris 开启 SSL 功能需要配置 CA 密钥证书和 Server 端密钥证书&#xff0c;如需开启双向认证&#xff0c;还需生成 Client 端密钥证书&#xff1a; 默认的 CA 密钥证书文件位于Doris/fe/mysql_ssl_default_certificate/ca_certificate.p12&#xff0c;默认密码为doris&#xf…...

【速览】数据库

一、课程性质和特点 数据库系统原理是高等教育自学考试计算机信息管理专业(独立本科段)、计算机网络专业(独立本科段)、计算机及应用专业(独立本科段)、计算机通信工程专业(独立本科段)考试计划的一门专业基础课。本课程的设置目的是为了使应考者掌握数据库系统的基本原理、方法…...

MySQL 中利用 mysql.help_topic 实现行转列的深入剖析

MySQL 中利用 mysql.help_topic 实现行转列的深入剖析 在数据库操作中&#xff0c;我们常常会遇到数据格式转换的需求。其中&#xff0c;行转列是一种常见的数据处理任务&#xff0c;它能将数据从一种便于存储的行结构&#xff0c;转换为更便于分析和展示的列结构。在 MySQL 数…...

学习使用smartengine

1、开源地址 smartengine的地址 GitCode - 全球开发者的开源社区,开源代码托管平台 2、如何基于这个开源的框架实现自己的业务定制 参考一些文章&#xff1a; 探索BPMN—工作流技术的理论与实践&#xff5c;得物技术...

鸿蒙保姆级教学

鸿蒙&#xff08;HarmonyOS&#xff09;是华为推出的一款面向全场景的分布式操作系统&#xff0c;支持手机、平板、智能穿戴、智能家居、车载设备等多种设备。鸿蒙系统的核心特点是分布式架构、一次开发多端部署和高性能。以下是从入门到大神级别的鸿蒙开发深度分析&#xff0c…...

HW华为流程管理体系精髓提炼华为流程运营体系(124页PPT)(文末有下载方式)

资料解读&#xff1a;HW华为流程管理体系精髓提炼华为流程运营体系&#xff08;124页PPT&#xff09; 详细资料请看本解读文章的最后内容。 华为作为全球领先的科技公司&#xff0c;其流程管理体系的构建与运营是其成功的关键之一。本文将从华为流程管理体系的核心理念、构建…...

What a code!

要在前后两个图表之间连接对应的坐标轴刻度点&#xff0c;可以通过在父部件中绘制线条来实现。以下是具体步骤和代码实现&#xff1a; 步骤说明 重写paintEvent函数&#xff1a;在Bigraph的paintEvent中绘制连接线。获取刻度值列表&#xff1a;根据每个坐标轴的最小值、最大值…...

Qt开发中的常见问题与解决方案

目录 1.Qt中大资源文件的处理 2.中文URL编码问题 3.编译器类型、版本与操作系统的判断 4.Qt版本与构建套件位数的判断 5.QWidget样式表不起作用的解决方案 6.动态改变弹簧的拉伸策略 7.文件操作的性能优化 8.自定义心跳包与TCP保活机制 9.Qt平台插件加载失败问题 10.…...

蓝桥杯嵌入式赛道复习笔记3(lcd与led引脚冲突问题)

直接上干货 1.在初始化lcd之前要关闭锁存器 切记一定要开启PD2的引脚&#xff0c;否则白搭 2.在用到的lcd函数要加 uint16_t temp GPIOC->ODR;GPIOC->ODR temp;例如...

【cf】交换

交换数组中元素&#xff0c;逆序对数1&#xff0c;所以逆序对奇偶性发生改变 D. Swap Dilemma https://www.cnblogs.com/pure4knowledge/p/18292578这个写的太好了 任意交换两个数&#xff0c;会使序列的逆序对数加减一个奇数。 所以如果两个序列&#xff0c;初始逆序对数的奇…...

anythingLLM之stream-chat传参

1、 接口地址 /v1/workspace/{slug}/stream-chat POST请求 {"message": "根据以下事件信息找出今天发生的事件有哪几个[{\"事件所在桩号\":\"K1045900\",\"事件发生位置&#xff08;经纬度值&#xff09;\":\"114.149…...

友思特应用 | 行业首创:基于深度学习视觉平台的AI驱动轮胎检测自动化

导读 全球领先的轮胎制造商 NEXEN TIRE 在其轮胎生产检测过程中使用了基于友思特伙伴Neurocle开发的AI深度学习视觉平台&#xff0c;实现缺陷检测率高达99.96%&#xff0c;是该行业首个使用AI平台技术推动缺陷检测自动化流程的企业。 将AI应用从轮胎开发扩展到制造过程 2024年…...

Python 变量的定义与使用:从基础到高级

Python 变量的定义与使用:从基础到高级 在 Python 中,变量是程序中最基本的概念之一。变量用于存储数据,并在程序运行过程中随时访问和修改这些数据。理解变量的定义和使用是学习 Python 编程的第一步。 1. 变量的定义 1.1 什么是变量? 变量是程序中用于存储数据的容器。…...

Linux 系统性能调优

概述 在日常运维和架构优化中&#xff0c;Linux 性能调优是提高系统稳定性和运行效率的重要手段。本文结合工作经验&#xff0c;总结了 Linux 服务器常见的优化技巧&#xff0c;涵盖 CPU、内存、磁盘 I/O、网络等多个方面&#xff0c;帮助大家在不同场景下快速定位和优化系统性…...

蓝桥杯备考:奶牛晒衣服

这道题第一眼想用贪心做&#xff0c;1 2 3 我们可以让最多的3用烘干机1秒就能完成&#xff0c;那么是不是我们每次都给湿度最大的衣服用烘干机呢&#xff1f;我们试试哈&#xff0c;比如[5,8]&#xff0c;每秒晒干1我们给8衣服一直用烘干机是需要4秒的&#xff0c;4秒后8这个…...

英伟达“AI 超级碗”开幕

Nvidia的AI和机器人技术进展 2025年03月19日 | AI日报 ![](https://i-blog.csdnimg.cn/direct/e7838b88f17f40c9a435f6dc48d26c59.jpeg#pic_center) 欢迎各位人工智能爱好者。 Nvidia的CEO Jensen Huang刚刚拉开了他的“AI超级碗”&#xff0c;并发表了关于该公司最新芯片、…...

Java使用FFmpegFrameGrabber进行视频拆帧,结合Thumbnails压缩图片保存到文件夹

引入依赖 <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.17</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ja…...

KVM安全模块生产环境配置与优化指南

KVM安全模块生产环境配置与优化指南 一、引言 在当今复杂多变的网络安全环境下&#xff0c;生产环境中KVM&#xff08;Kernel-based Virtual Machine&#xff09;的安全配置显得尤为重要。本指南旨在详细阐述KVM安全模块的配置方法&#xff0c;结合强制访问控制&#xff08;M…...

如何设计一个 RPC 框架?需要考虑哪些点?

设计一个完整的 RPC 框架需要覆盖以下核心模块及关键技术点&#xff1a; 一、核心架构模块 模块功能与实现要点服务注册与发现使用 Zookeeper/Nacos 等实现服务地址动态注册与订阅&#xff0c;支持心跳检测和节点变更通知网络通信层基于 Netty 或 gRPC 的 HTTP/2 实现异步非阻…...

dify+deepseek联网搜索:免费开源搜索引擎Searxng使用(让你的大模型也拥有联网的功能)

docker安装SearXng 项目地址:https://github.com/searxng/searxng-docker 第一步 git clone下来 git clone https://github.com/searxng/searxng-docker.git第二步 进入 searxng-docker目录中修改docker-compose.yaml(直接复制粘贴) cd searxng-dockerdocker-compose.yaml …...

主流的Java生态下权限管理框架

在当今国内互联网行业中&#xff0c;主流的Java生态下权限管理框架主要分为三类&#xff1a; 通用权限框架&#xff08;含认证和权限&#xff09;权限细粒度控制框架&#xff08;专注资源访问&#xff09;企业级安全认证和权限框架&#xff08;更完善的安全功能&#xff09; &…...

dijkstra算法——47. 参加科学大会

卡码网:47. 参加科学大会https://kamacoder.com/problempage.php?pid=1047 题目描述 小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。 小明的起点是第一个车站,终点是最后一个车站。然而,途中的各个车站之间的道路状况、交通拥堵程度以…...

LAC拨号的L2TP VPN实验

目录 一.拓扑信息​ 二.需求分析 三.详细配置信息 1.基础信息配置 服务器&#xff1a; 2.建立PPPOE 3.建立L2TP隧道 4.安全策略 四.测试 一.拓扑信息​ 二.需求分析 一.基础信息配置&#xff08;IP和安全区域&#xff09; 二.建立PPPOE连接 是FW1和FW2之间的配置&#…...

天梯赛 PTAL2-009 抢红包

很简单的一道模拟题&#xff0c;使用map统计每个用户的钱数和红包数&#xff0c;最后在使用结构体存储&#xff0c;重载小于号&#xff0c;sort排序即可。 #include <bits/stdc.h> using namespace std; #define endl \n #define int long long typedef long long ll; c…...

信息学奥赛一本通 1831:【03NOIP提高组】神经网络 | 洛谷 P1038 [NOIP 2003 提高组] 神经网络

【题目链接】 ybt 1831&#xff1a;【03NOIP提高组】神经网络 洛谷 P1038 [NOIP 2003 提高组] 神经网络 【题目考点】 1. 图论&#xff1a;拓扑排序&#xff0c;有向无环图动规 【解题思路】 神经网络是一个有向无环图&#xff0c;输入层神经元是入度为0的顶点&#xff0c…...

如何切换node版本

在Linux或MacOS系统中&#xff0c;切换Node.js版本通常可以通过nvm&#xff08;Node Version Manager&#xff09;工具来实现。nvm允许你在不同的Node.js版本之间轻松切换&#xff0c;而无需重新安装或配置。 安装nvm 使用curl命令安装nvm&#xff08;适用于大多数Linux发行版…...

前端样式库推广——TailwindCss

官方网址&#xff1a; https://tailwindcss.com/docs/installation/using-vite 中文官方文档&#xff1a;https://www.tailwindcss.cn/ github地址&#xff1a;tailwindcss 正在使用tailwindcss的网站&#xff1a;https://tailwindcss.com/showcase 一看github&#xff0c;竟然…...

【前端 vue 或者麦克风,智能语音识别和播放功能】

前端 vue 或者麦克风&#xff0c;智能语音识别和播放功能 1. 终端安装 npm install recordrtc2.引入 import RecordRTC from recordrtc3.html&#xff08;根据自己业务更改&#xff09; <div class"Page"><el-form ref"mainFormRef" class&qu…...

Java基础编程练习第34题-正则表达式

在Java里&#xff0c;正则表达式是一种强大的文本处理工具&#xff0c;它可以用于字符串的搜索、替换、分割和校验等操作。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。Java通过java.util.regex包提供了对正则表达式的支持。 以下是正则表达式在Jav…...

Java+Html实现前后端客服聊天

文章目录 核心组件网络通信层事件调度层服务编排层 Spring实现客服聊天技术方案对比WebScoket建立连接用户上线实现指定用户私聊群聊离线 SpringBootWebSocketHtmljQuery实现客服聊天1. 目录结构2. 配置类3. 实体类、service、controller4. ChatWebSocketHandler消息处理5.前端…...

基于Spring Boot的冷链物流系统的设计与实现的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

《线程池:Linux平台编译线程池动态库发生的死锁问题》

关于如何编译动态库可以移步《Linux&#xff1a;动态库动态链接与静态库静态链接》-CSDN博客 我们写的线程池代码是闭源的&#xff0c;未来想提供给别人使用&#xff0c;只需要提供so库和头文件即可。 系统默认库文件路径为&#xff1a; usr/lib usr/loacl/lib 系统默认头文件…...

鸿蒙NEXT项目实战-百得知识库03

代码仓地址&#xff0c;大家记得点个star IbestKnowTeach: 百得知识库基于鸿蒙NEXT稳定版实现的一款企业级开发项目案例。 本案例涉及到多个鸿蒙相关技术知识点&#xff1a; 1、布局 2、配置文件 3、组件的封装和使用 4、路由的使用 5、请求响应拦截器的封装 6、位置服务 7、三…...

sql server数据迁移,springboot搭建开发环境遇到的问题及解决方案

最近搭建springboot项目开发环境&#xff0c;数据库连的是sql server&#xff0c;遇到许多问题在此记录一下。 1、sql server安装教程 参考&#xff1a;https://www.bilibili.com/opus/944736210624970769 2、sql server导出、导入数据库 参考&#xff1a;https://blog.csd…...

Sensodrive机器人力控关节模组SensoJoint在海洋垃圾清理机器人中的拓展应用

海洋污染已成为全球性的环境挑战&#xff0c;其中海底垃圾的清理尤为困难。据研究&#xff0c;海洋中约有2600万至6600万吨垃圾&#xff0c;超过90%沉积在海底。传统上&#xff0c;潜水员收集海底垃圾不仅成本高昂&#xff0c;而且充满风险。为解决这一问题&#xff0c;欧盟资助…...

matrix-breakout-2-morpheus 靶机----练习攻略 【仅获取shell】

【此练习仅做到反弹shell】 1.靶机下载地址 https://download.vulnhub.com/matrix-breakout/matrix-breakout-2-morpheus.ova 2. 打开靶机&#xff0c;kali使用nmap扫描同C段的主机 找到靶机ip 确保靶机和kali网卡均为NAT模式 先查看kali的ip nmap 192.168.182.1/24 …...

吴恩达机器学习笔记复盘(八)多元线性回归的梯度下降

简介 梯度下降是多元线性回归的主流优化方法&#xff0c;具有普适性和可扩展性&#xff0c;而标准方程法适用于特定场景。实际应用中需结合特征工程和参数调优提升模型性能。本篇不复盘参数调优。 1.多元线性回归模型 多元线性回归模型假设因变量 与多个自变量 之间存在线性…...

SAP-ABAP: 采购申请创建(PR)BAPI_PR_CREATE 技术指南-详解

BAPI_PR_CREATE 技术指南 用途&#xff1a;通过 RFC 接口创建 SAP 采购申请&#xff08;PR&#xff09;&#xff0c;支持自动化集成与批量处理。 一、功能概览 类别说明核心功能创建标准采购申请、预留转采购申请&#xff0c;支持多行项目及账户分配。集成场景与 MRP 系统、外…...

Python:单继承方法的重写

继承&#xff1a;让类和类之间转变为父子关系&#xff0c;子类默认继承父类的属性和方法 单继承&#xff1a; class Person:def eat(self):print("eat")def sing(self):print("sing") class Girl(Person):pass#占位符&#xff0c;代码里面类下面不写任何东…...