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

Linux 入门八:Linux 多进程

一、概述

1.1 什么是进程?

在 Linux 系统中,进程是程序的一次动态执行过程。程序是静态的可执行文件,而进程是程序运行时的实例,系统会为其分配内存、CPU 时间片等资源。例如,输入 ls 命令时,系统创建进程执行 ls 程序来显示文件列表。进程是资源分配的基本单位,理解进程对掌握 Linux 系统运行机制至关重要。

1.2 查看进程

在 Linux 中,可使用 ps 命令查看系统中当前运行的进程。下面是一些常用的 ps 命令参数组合:

  • ps -ef
    • 功能:以全格式显示所有进程的详细信息。
    • 步骤
      1. 打开终端。
      1. 输入 ps -ef 并回车。
    • 示例输出
 
UID PID PPID C STIME TTY TIME CMDroot 1 0 0 00:00 ? 00:00:01 /sbin/init splashroot 2 0 0 00:00 ? 00:00:00 [kthreadd]

  • 参数解释
    • UID:进程所有者的用户 ID。
    • PID:进程的 ID 号。
    • PPID:父进程的 ID 号。
    • C:CPU 占用率。
    • STIME:进程启动时间。
    • TTY:进程关联的终端。
    • TIME:进程使用的 CPU 时间。
    • CMD:启动进程的命令。

在 Linux 中,除了 ps -ef,还可使用以下命令查看进程:​

  • ps aux:​
  • 功能:显示所有进程的详细资源使用情况(如内存、CPU 占用率)。​
  • 示例输出:​
TypeScript取消自动换行复制USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND ​root 1 0.0 0.1 24176 4360 ? Ss 00:00 0:01 /sbin/init splash ​

  • %CPU:CPU 占用百分比。​
  • %MEM:内存占用百分比。​
  • STAT:进程状态(如 S 表示睡眠,R 表示运行)。​
  • top 命令:​
  • 功能:动态实时显示进程资源占用情况,类似 Windows 任务管理器。​
  • 操作:输入 top 后,可按 q 退出。

二、进程的创建

2.1 fork 函数

在 C 语言里,fork 函数是创建新进程的关键函数。它的作用是复制当前进程,生成一个子进程,原进程则成为父进程。fork 函数的原型如下:

#include <unistd.h>pid_t fork(void);
  • 返回值
    • 在父进程中,fork 函数返回子进程的 PID(一个正整数)。
    • 在子进程中,fork 函数返回 0。
    • 若 fork 失败,返回 -1。
创建进程的步骤
  1. 包含必要的头文件:#include <unistd.h> 和 #include <stdio.h>。
  1. 调用 fork 函数创建子进程。
  1. 根据 fork 的返回值判断当前是父进程还是子进程,并执行相应的代码。
示例代码
#include <unistd.h>#include <stdio.h>int main() {pid_t pid;pid = fork();if (pid < 0) {perror("fork 失败");} else if (pid == 0) {// 子进程printf("我是子进程,我的 PID 是 %d,父进程的 PID 是 %d\n", getpid(), getppid());} else {// 父进程printf("我是父进程,我的 PID 是 %d,子进程的 PID 是 %d\n", getpid(), pid);}return 0;}
编译和运行步骤
  1. 把上述代码保存为 fork_example.c。
  1. 打开终端,进入代码所在目录。
  1. 使用 gcc 编译代码:gcc fork_example.c -o fork_example。
  1. 运行编译后的可执行文件:./fork_example。

三、僵尸进程

3.1 形成条件

僵尸进程的形成需要满足以下三个条件:

  1. 子进程优先于父进程结束。
  1. 父进程不结束。
  1. 父进程不调用 wait 函数。

当子进程结束时,它会向父进程发送一个 SIGCHLD 信号,但如果父进程没有调用 wait 或 waitpid 函数来回收子进程的资源,子进程就会变成僵尸进程。

3.2 如何避免僵尸进程

方法一:父进程调用 wait 函数

wait 函数的作用是等待任意一个子进程结束,并回收其资源。其原型如下:

#include <sys/types.h>#include <sys/wait.h>pid_t wait(int *status);
  • 参数:status 用于存储子进程的退出状态。
  • 返回值:返回结束的子进程的 PID。
示例代码
#include <unistd.h>#include <stdio.h>#include <sys/types.h>#include <sys/wait.h>int main() {pid_t pid;pid = fork();if (pid < 0) {perror("fork 失败");} else if (pid == 0) {// 子进程printf("子进程开始执行,PID 是 %d\n", getpid());sleep(2);printf("子进程结束\n");} else {// 父进程int status;pid_t child_pid = wait(&status);printf("父进程回收了 PID 为 %d 的子进程\n", child_pid);}return 0;}
方法二:使用 signal 函数处理 SIGCHLD 信号

可通过 signal 函数捕获 SIGCHLD 信号,并在信号处理函数中调用 wait 或 waitpid 函数。

示例代码
#include <unistd.h>#include <stdio.h>#include <sys/types.h>#include <sys/wait.h>#include <signal.h>void sigchld_handler(int signo) {pid_t pid;int status;while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {printf("回收了 PID 为 %d 的子进程\n", pid);}}int main() {signal(SIGCHLD, sigchld_handler);pid_t pid;pid = fork();if (pid < 0) {perror("fork 失败");} else if (pid == 0) {// 子进程printf("子进程开始执行,PID 是 %d\n", getpid());sleep(2);printf("子进程结束\n");} else {// 父进程printf("父进程继续执行\n");sleep(5);}return 0;}

四、孤儿进程

4.1 形成条件

孤儿进程的形成需要满足以下两个条件:

  1. 父进程优先于子进程结束。
  1. 子进程未结束。

当父进程结束后,子进程就会变成孤儿进程,此时它会被进程 ID 为 1 的 init 进程接管。

4.2 被进程 ID 为 1 的进程接管

init 进程会负责回收孤儿进程的资源,确保系统资源不会被浪费。

示例代码
#include <unistd.h>#include <stdio.h>int main() {pid_t pid;pid = fork();if (pid < 0) {perror("fork 失败");} else if (pid == 0) {// 子进程printf("子进程开始执行,父进程 PID 是 %d\n", getppid());sleep(5);printf("子进程继续执行,父进程 PID 是 %d\n", getppid());} else {// 父进程printf("父进程结束\n");}return 0;}

在这个示例中,父进程会先结束,子进程在睡眠 5 秒后,会发现自己的父进程 ID 变成了 1。

五、守护进程(后台进程)

5.1 实现过程

守护进程是一种在后台持续运行的进程,通常在系统启动时就开始运行,并且不受用户登录和注销的影响。以下是创建守护进程的详细步骤:

步骤 1:创建子进程,父进程退出
#include <unistd.h>#include <stdio.h>#include <stdlib.h>int main() {pid_t pid;pid = fork();if (pid < 0) {perror("fork 失败");exit(EXIT_FAILURE);}if (pid > 0) {// 父进程退出exit(EXIT_SUCCESS);}// 子进程继续执行// 后续步骤...return 0;}
步骤 2:在子进程中创建新会话
#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>int main() {pid_t pid;pid = fork();if (pid < 0) {perror("fork 失败");exit(EXIT_FAILURE);}if (pid > 0) {// 父进程退出exit(EXIT_SUCCESS);}// 子进程创建新会话pid_t sid = setsid();if (sid < 0) {perror("setsid 失败");exit(EXIT_FAILURE);}// 后续步骤...return 0;}

setsid 函数的作用是创建一个新的会话,使子进程成为新会话的首进程,并且脱离原有的控制终端。

步骤 3:改变工作目录
#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>int main() {pid_t pid;pid = fork();if (pid < 0) {perror("fork 失败");exit(EXIT_FAILURE);}if (pid > 0) {// 父进程退出exit(EXIT_SUCCESS);}// 子进程创建新会话pid_t sid = setsid();if (sid < 0) {perror("setsid 失败");exit(EXIT_FAILURE);}// 改变工作目录if (chdir("/") < 0) {perror("chdir 失败");exit(EXIT_FAILURE);}// 后续步骤...return 0;}

chdir 函数用于将工作目录切换到根目录,避免工作目录被卸载导致进程无法正常工作。

步骤 4:设置文件权限掩码
#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>int main() {pid_t pid;pid = fork();if (pid < 0) {perror("fork 失败");exit(EXIT_FAILURE);}if (pid > 0) {// 父进程退出exit(EXIT_SUCCESS);}// 子进程创建新会话pid_t sid = setsid();if (sid < 0) {perror("setsid 失败");exit(EXIT_FAILURE);}// 改变工作目录if (chdir("/") < 0) {perror("chdir 失败");exit(EXIT_FAILURE);}// 设置文件权限掩码umask(0);// 后续步骤...return 0;}

umask 函数用于设置文件权限掩码,确保守护进程创建的文件具有预期的权限。

步骤 5:关闭不需要的文件描述符
#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>int main() {pid_t pid;pid = fork();if (pid < 0) {perror("fork 失败");exit(EXIT_FAILURE);}if (pid > 0) {// 父进程退出exit(EXIT_SUCCESS);}// 子进程创建新会话pid_t sid = setsid();if (sid < 0) {perror("setsid 失败");exit(EXIT_FAILURE);}// 改变工作目录if (chdir("/") < 0) {perror("chdir 失败");exit(EXIT_FAILURE);}// 设置文件权限掩码umask(0);// 关闭不需要的文件描述符close(STDIN_FILENO);close(STDOUT_FILENO);close(STDERR_FILENO);// 守护进程的主循环while (1) {// 执行守护进程的任务sleep(1);}return 0;}

关闭标准输入、标准输出和标准错误输出的文件描述符,防止守护进程与控制终端交互。

编译和运行步骤

  1. 把上述代码保存为 daemon_example.c。
  1. 打开终端,进入代码所在目录。
  1. 使用 gcc 编译代码:gcc daemon_example.c -o daemon_example。
  1. 运行编译后的可执行文件:./daemon_example。此时,守护进程会在后台持续运行。

通过以上步骤,你可以逐步掌握 Linux 多进程的相关知识,包括进程的创建、僵尸进程和孤儿进程的处理,以及守护进程的实现。在实际应用中,多进程编程可以提高程序的并发性能,充分利用多核 CPU 的资源。

相关文章:

Linux 入门八:Linux 多进程

一、概述 1.1 什么是进程&#xff1f; 在 Linux 系统中&#xff0c;进程是程序的一次动态执行过程。程序是静态的可执行文件&#xff0c;而进程是程序运行时的实例&#xff0c;系统会为其分配内存、CPU 时间片等资源。例如&#xff0c;输入 ls 命令时&#xff0c;系统创建进程…...

学习如何设计大规模系统,为系统设计面试做准备!

前言 在当今快速发展的技术时代&#xff0c;系统设计能力已成为衡量一名软件工程师专业素养的重要标尺。随着云计算、大数据、人工智能等领域的兴起&#xff0c;构建高性能、可扩展且稳定的系统已成为企业成功的关键。然而&#xff0c;对于许多工程师而言&#xff0c;如何有效…...

前端防御性编程

关于防御性编程 你是否遇到过&#xff0c;接口请求失败或者返回数据错误&#xff0c;导致系统白屏或者前端自身写的代码存在一些缺陷&#xff0c;导致整个系统不够健壮&#xff0c;从而导致系统白屏 常见的问题与防范 最常见的问题 访问了null或者undefined的属性 null.a …...

Java工具类-assert断言

我们可能经常在项目的单元测试或者一些源码中看到别人在使用assert关键字&#xff0c;当然也不只是Java语言&#xff0c;很多编程语言也都能看到&#xff0c;我们大概知道断言可以用于测试中条件的校验&#xff0c;但却不经常使用&#xff0c;本文总结了Java中该工具类的使用。…...

215. 数组中的第K个最大元素

1、题目分析 顾名思义。 2.算法原理 利用排序&#xff0c;再找到第k个最大的数字即可。 3.代码实操 class Solution { public:int findKthLargest(vector<int>& nums, int k) {sort(nums.begin(),nums.end());return nums[nums.size()-k];//123456真的方便啊} };…...

【2025年泰迪杯数据挖掘挑战赛】B题 详细解题思路+数据预处理+代码分享

目录 2025年泰迪杯B题详细解题思路问题一问题分析数学模型Python代码Matlab代码 问题二问题分析数学模型Python代码Matlab代码 问题三问题分析数学模型Python代码Matlab代码 问题四问题分析数学模型Python代码Matlab代码 2025年泰迪杯B题详细解题思路 初步分析整理了B题的赛题分…...

对shell脚本敏感命令进行加密执行

我要加密这条命令&#xff1a;rm /root/scripty.sh 如何利用openssl aes-256-cbc 实现加密和解密&#xff0c;并执行命令 加密、解密并执行命令的完整流程 以下是使用 openssl aes-256-cbc 加密命令 rm /root/scripty.sh&#xff0c;解密并执行的详细步骤&#xff1a; 1. 加密…...

SQL ⑦-索引

索引 索引是一种特殊的数据结构&#xff0c;它帮助数据库系统高效地找到数据。 索引通过一定的规则排列数据表中的记录&#xff0c;使得对表的查询可以通过对索引的搜索来加快速度。 索引好比书籍的目录&#xff0c;能帮助你快速找到相应的章节。 B树 B树是一种经常用于数…...

LinkedBlockingQueue使用场景有哪些

1、LinkedBlockingQueue 的特点 LinkedBlockingQueue 是 Java 中 java.util.concurrent 包下的一种阻塞队列&#xff0c;它有以下几个主要特点&#xff1a; 1.线程安全 LinkedBlockingQueue 是线程安全的&#xff0c;它内部使用了锁机制来确保多线程环境下的并发访问不会导致…...

关于难例损失函数小记

什么是难例损失函数&#xff08;Hard Example Loss Function&#xff09; 这玩意儿是深度学习训练中非常重要又很实用的一个概念&#xff0c;特别适用于处理 数据不平衡、模型收敛缓慢、或者**想让模型更“挑剔”**的场景。 &#x1f31f; 先从名字讲起&#xff1a; “难例”…...

小程序开发指南

小程序开发指南 目录 1. 小程序开发概述 1.1 什么是小程序1.2 小程序的优势1.3 小程序的发展历程 2. 开发准备工作 2.1 选择开发平台2.2 开发环境搭建2.3 开发模式选择 3. 小程序开发流程 3.1 项目规划3.2 界面设计3.3 代码开发3.4 基本开发示例3.5 数据存储3.6 网络请求3.7 …...

RCE漏洞学习

1&#xff0c;What is RCE&#xff1f; 在CTF&#xff08;Capture The Flag&#xff09;竞赛中&#xff0c;RCE漏洞指的是远程代码执行漏洞&#xff08;Remote Code Execution&#xff09;。这类漏洞允许攻击者通过某种方式在目标系统上执行任意代码&#xff0c;从而完全控制目…...

青少年编程考试 CCF GESP图形化编程 三级认证真题 2025年3月

图形化编程 三级 2025 年 03 月 一、单选题&#xff08;共 15 题&#xff0c;每题 2 分&#xff0c;共 30 分&#xff09; 1、2025 年春节有两件轰动全球的事件&#xff0c;一个是 DeepSeek 横空出世&#xff0c;另一个是贺岁 片《哪吒 2》票房惊人&#xff0c;入了全球票房榜…...

一、绪论(Introduction of Artificial Intelligence)

写在前面&#xff1a; 老师比较看重的点&#xff1a;对问题的概念本质的理解&#xff0c;不会考试一堆运算的东西&#xff0c;只需要将概念理解清楚就可以&#xff0c;最后一个题会出一个综合题&#xff0c;看潜力&#xff0c;前面的部分考的不是很深&#xff0c;不是很难&…...

多模态大语言模型arxiv论文略读(十五)

## Jailbreaking GPT-4V via Self-Adversarial Attacks with System Prompts ➡️ 论文标题&#xff1a;Jailbreaking GPT-4V via Self-Adversarial Attacks with System Prompts ➡️ 论文作者&#xff1a;Yuanwei Wu, Xiang Li, Yixin Liu, Pan Zhou, Lichao Sun ➡️ 研究机…...

漏洞报告:多短视频平台时间差举报滥用漏洞

漏洞标题&#xff1a;跨平台内容发布时序漏洞导致的恶意举报攻击向量 漏洞类型&#xff1a;逻辑缺陷/滥用机制 漏洞等级&#xff1a;中高风险 漏洞描述&#xff1a; 攻击者可利用多平台内容发布时间差&#xff0c;伪造原创证明对合法内容发起恶意举报。该漏洞源于平台间缺乏发…...

【LINUX】学习宝典

一.Linux系统常用单词翻译 1.new folder 新建文件夹 2.paste 粘贴 3.select all 全选 4.open in terminal 打开终端/命令行 5.keep aligned 保持对齐 6.organize deaktop by name按名称组织桌面 7.change background更改背景 8.cancel 取消 9.create创造 创建 10.wal…...

青少年编程考试 CCF GESP图形化编程 四级认证真题 2025年3月

图形化编程 四级 2025 年 03 月 一、单选题&#xff08;共 10 题&#xff0c;每题 2 分&#xff0c;共 30 分&#xff09; 1、2025 年春节有两件轰动全球的事件&#xff0c;一个是 DeepSeek 横空出世&#xff0c;另一个是贺岁片《哪吒 2》票房惊人&#xff0c;入了全球票房榜…...

学习海康VisionMaster之平行线查找

一&#xff1a;进一步学习了 今天学习下VisionMaster中的平行线查找&#xff0c;这个还是拟合直线的衍生应用&#xff0c;可以同时测量两条线段&#xff0c;输出中线 二&#xff1a;开始学习 1&#xff1a;什么是平行线查找&#xff1f; 按照传统的算法&#xff0c;必须是开两…...

小甲鱼第004讲:变量和字符串(下)| 课后测试题及答案

问答题: 0. 请问下面代码有没有毛病&#xff0c;为什么? 请问下面代码为什么会出错&#xff0c;应该如何解决&#xff1f; 答:这是由于在字符串中&#xff0c;反斜杠()会与其随后的字符共同构成转义字符。 为了避免这种不测情况的发生&#xff0c;我们可以在字符串的引号前面…...

2025 蓝桥杯省赛c++B组个人题解

声明 本题解为退役蒻苟所写&#xff0c;不保证正确性&#xff0c;仅供参考。 花了大概2个半小时写完&#xff0c;感觉比去年省赛简单&#xff0c;难度大概等价于 codeforces dv4.5 吧 菜鸡不熟悉树上背包&#xff0c;调了一个多小时 题目旁边的是 cf 预测分 所有代码均以通…...

2025蓝桥杯算法竞赛深度突破:创新题型与高阶策略全解析

一、新型算法范式实战 1.1 元启发式算法应用&#xff08;预测难度&#xff1a;★★★★&#xff09; 题目场景&#xff1a;星际货物装载 需在飞船载重限制下选择最优货物组合&#xff0c;引入遗传算法解决NP-Hard问题&#xff1a; 染色体编码&#xff1a;二进制串表示货物选择…...

网络流量管理-流(Flow)

1. 传统网络的问题&#xff1a;快递员送信模式 想象你每天要寄100封信给同一个朋友&#xff0c;传统网络的处理方式就像一个固执的快递员&#xff1a; 每封信都单独处理&#xff1a;检查地址、规划路线、盖章、装车…即使所有信的目的地、收件人都相同&#xff0c;也要重复100…...

Spring Boot对接马来西亚股票数据源API

随着对东南亚市场的兴趣日益增长&#xff0c;获取马来西亚股票市场的实时和历史数据变得尤为重要。本文将指导您如何使用Spring Boot框架对接一个假定的马来西亚股票数据源API&#xff08;例如&#xff0c;StockTV API&#xff09;&#xff0c;以便开发者能够轻松访问和处理这些…...

MySQL 面经

1、什么是 MySQL&#xff1f; MySQL 是一个开源的关系型数据库&#xff0c;现在隶属于 Oracle 公司。是我们国内使用频率最高的一种数据库&#xff0c;我本地安装的是比较新的 8.0 版本。 1.1 怎么删除/创建一张表&#xff1f; 可以使用 DROP TABLE 来删除表&#xff0c;使用…...

【Flink运行时架构】作业提交流程

本文介绍在单作业模式下Flink提交作业的具体流程&#xff0c;如下图所示。 客户端将作业提交给YARN的RM&#xff1b;YARN的RM启动Flink JobManager&#xff0c;并将作业提交给JobMaster&#xff1b;JobMaster向Flink内置的RM请求slots&#xff1b;Flink内置的RM向YARN RM请求…...

【AutoTest】自动化测试工具大全(Java)

&#x1f60a; 如果您觉得这篇文章有用 ✔️ 的话&#xff0c;请给博主一个一键三连 &#x1f680;&#x1f680;&#x1f680; 吧 &#xff08;点赞 &#x1f9e1;、关注 &#x1f49b;、收藏 &#x1f49a;&#xff09;&#xff01;&#xff01;&#xff01;您的支持 &#x…...

当DRAM邂逅SSD:新型“DRAM+”存储技术来了!

在当今快速发展的科技领域&#xff0c;数据存储的需求日益增长&#xff0c;对存储设备的性能和可靠性提出了更高的要求。传统DRAM以其高速度著称&#xff0c;但其易失性限制了应用范围&#xff1b;而固态硬盘SSD虽然提供非易失性存储&#xff0c;但在速度上远不及DRAM。 为了解…...

【算法】快速排序

算法系列六&#xff1a;快速排序 一、快速排序的递归探寻 1.思路 2.书写 3.搭建 3.1设计过掉不符情况&#xff08;在最底层时&#xff09; 3.2查验能实现基础结果&#xff08;在最底层往上点时&#xff09; 3.3跳转结果继续往上回搭 4.实质 二、快速排序里的基准排序 …...

Python快速入门指南:从零开始掌握Python编程

文章目录 前言一、Python环境搭建&#x1f94f;1.1 安装Python1.2 验证安装1.3 选择开发工具 二、Python基础语法&#x1f4d6;2.1 第一个Python程序2.2 变量与数据类型2.3 基本运算 三、Python流程控制&#x1f308;3.1 条件语句3.2 循环结构 四、Python数据结构&#x1f38b;…...

机器学习中的数学(PartⅡ)——线性代数:2.1线性方程组

概述&#xff1a; 现实中很多问题都可被建模为线性方程组问题&#xff0c;而线性代数为我们提供了解决这类问题的工具。先看两个例子&#xff1a; 例子1&#xff1a; 一家公司有n个产品&#xff0c;分别是&#xff0c;生产上述产品需要m种原料&#xff0c;每个产品需要其中一…...

大模型上下文协议MCP详解(2)—核心功能

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 标准化上下文交互技术 1.1 实时数据接入能力 MCP(Model Context Protocol)通过标准化的接口,为 AI 模型提供了强大的实时数据接入能力,使其能够快速获取和处理来自不同数据源的实时信息。…...

检测到目标URL存在http host头攻击漏洞

漏洞描述 修复措施 方法一: nginx 的 default_server 指令可以定义默认的 server 去处理一些没有匹配到 server_name 的请求,如果没有显式定义,则会选取第一个定义的 server 作为 default_server。 server {listen 80 default_server; …...

【 Beautiful Soup (bs4) 详解】

引言 Beautiful Soup 是 Python 最流行的 HTML/XML 解析库&#xff0c;能够从复杂的网页文档中高效提取数据。以下是其核心知识点及示例代码。 一、库简介 1. 核心模块 BeautifulSoup&#xff1a;主类&#xff0c;用于构建文档树结构Tag&#xff1a;表示 HTML/XML 标签的对象…...

Cuto壁纸 2.6.9 | 解锁所有高清精选壁纸,无广告干扰

Cuto壁纸 App 提供丰富多样的壁纸选择&#xff0c;涵盖动物、风景、创意及游戏动漫等类型。支持分类查找与下载&#xff0c;用户可轻松将心仪壁纸设为手机背景&#xff0c;并享受软件内置的编辑功能调整尺寸。每天更新&#xff0c;确保用户总能找到新鲜、满意的壁纸。 大小&am…...

人工智能之数学基础:复矩阵

本文重点 复矩阵是线性代数中以复数为元素的矩阵,是实矩阵在复数域上的自然推广。与实矩阵相比,复矩阵在数学性质、运算规则和应用场景上具有独特性,尤其在量子力学、信号处理、控制理论等领域发挥关键作用。 复矩阵的定义与表示 定义:复矩阵指的是元素含有复数的矩阵。…...

numpy初步掌握

文章目录 一、前言二、概述2.1 安装2.2 基础 三、数组3.1 数组创建3.1.1 从已有数据创建3.1.2 创建特殊值数组3.1.3 创建数值范围数组3.1.4 随机数组生成3.1.5 其他 3.2 数组属性 四、数组操作4.1 索引/切片4.2 数组遍历4.3 修改形状4.4 更多 五、数组运算5.1 常规运算5.2 广播…...

unity曲线射击

b站教程 using UnityEngine; using System.Collections;public class BallLauncher : MonoBehaviour {public float m_R;public NewBullet m_BulletPre;public Transform m_Target;private void Start(){StartCoroutine(Attack());}private void OnDestroy(){StopAllCoroutine…...

[特殊字符] 各领域 Dummy 开关实现方式大集合

涵盖硬件、软件、工业控制、游戏开发及网络虚拟化场景&#xff1a; &#x1f50c; 1. 电子 / 硬件工程 &#x1f6e0;️ (1) 物理替代方案 &#x1f9f2; 跳线帽&#xff08;Jumper&#xff09;或短路块 &#x1f449; 模拟开关“开/关”状态 ✅ 示例&#xff1a;开发板上的 B…...

深度解析基于 Web Search MCP的Deep Research 实现逻辑

写在前面 大型语言模型(LLM)已成为我们获取信息、生成内容的重要工具。但它们的知识大多截止于训练数据的时间点,对于需要实时信息、跨领域知识整合、多角度观点比较的深度研究 (Deep Research) 任务,它们往往力有不逮。如何让 LLM 突破自身知识的局限,像人类研究员一样,…...

set 的 contains

语法&#xff1a; set<int> num_set; st.contains(num); 在 C 中&#xff0c;!num_set.contains(num - 1) 这行代码通常用于检查一个集合&#xff08;num_set&#xff09;中是否不存在某个值&#xff08;num - 1&#xff09;。以下是对这行代码的详细解释&#xff1a;…...

深度学习总结(7)

用计算图进行自动微分 思考反向传播的一种有用方法是利用计算图(compu- tation graph)​。计算图是TensorFlow和深度学习革命的核心数据结构。它是一种由运算(比如我们用到的张量运算)构成的有向无环图。下图给出了一个模型的计算图表示。 计算图是计算机科学中一个非常…...

linux网络环境配置

今天我们来了解一下ip获取的两种方式,知道两者的特点,并且学会配置静态ip,那么话不多说,来看. linux网络环境配置. .第一种方式(自动获取): 说明:登录后,通过界面的来设置自动获取ip,特点;Linux启动后会自动获取ip,缺点是每次自动获取的ip地址可能不一样. 第二种方式(指定I…...

SSRF漏洞公开报告分析

文章目录 1. SSRF | 获取元数据 | 账户接管2. AppStore | 版本上传表单 | Blind SSRF3. HOST SSRF一、为什么HOST修改不会影响正常访问二、案例 4. Turbonomic 的 终端节点 | SSRF 获取元密钥一、介绍二、漏洞分析 5. POST | Blind SSRF6. CVE-2024-40898利用 | SSRF 泄露 NTL…...

Java接口深度解析

一、为什么需要接口 接口是Java实现多态的重要机制&#xff0c;核心价值体现在&#xff1a; ​​实现多继承能力​​&#xff1a;突破单继承限制&#xff0c;允许类实现多个接口​​规范系统解耦​​&#xff1a;制定通用标准&#xff0c;隔离实现与调用方​​增强扩展性​​…...

VitePress 项目部署 cloudflare page 提示 npm run build 错误

构建的错误信息如下&#xff1a; 09:52:57.975 ➤ YN0000: Done with warnings in 3s 120ms 09:52:58.072 Executing user command: npm run build 09:52:58.817 npm ERR! Missing script: "build" 09:52:58.818 npm ERR! 09:52:58.818 npm ERR! To see a list of …...

#Hash 模式 vs History 模式

&#x1f4cc; 一、概念对比&#xff1a;Hash 模式 vs History 模式 特性Hash 模式History 模式URL 样式http://example.com/#/homehttp://example.com/home是否刷新页面❌ 不会刷新&#xff08;仅 hash 变化&#xff09;✅ 通过 HTML5 API 控制&#xff0c;不刷新原理window.…...

图像融合(Image Fusion)是什么

图像融合&#xff08;Image Fusion&#xff09;将来自相同类型传感器或成像方式的多幅图像&#xff08;通常内容是一样的&#xff09;进行融合&#xff0c;提高图像清晰度、对比度、空间或时间分辨率。得到比原始图像更清晰或信息更丰富的图像 常见类型&#xff1a; 多时相图…...

基于YOLOV8的中草药识别检测系统(包含数据集+PyQt5界面+系统代码)

一、简介 本项目构建了基于 YOLOV8 深度学习网络模型的中草药识别检测系统。凭借 YOLOV8 卓越的性能&#xff0c;该系统能够高效、精准地识别检测大枣、 百合、黄连 、乌梅、厚朴 、牡蛎 、海马 、罗汉果 、甘草、三七、 通草、 薏苡仁、 枸杞子 、八角茴香等 50种常见植物中草…...

【愚公系列】《高效使用DeepSeek》066-纠纷解决话术

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...