Linux 入门八:Linux 多进程
一、概述
1.1 什么是进程?
在 Linux 系统中,进程是程序的一次动态执行过程。程序是静态的可执行文件,而进程是程序运行时的实例,系统会为其分配内存、CPU 时间片等资源。例如,输入 ls 命令时,系统创建进程执行 ls 程序来显示文件列表。进程是资源分配的基本单位,理解进程对掌握 Linux 系统运行机制至关重要。
1.2 查看进程
在 Linux 中,可使用 ps 命令查看系统中当前运行的进程。下面是一些常用的 ps 命令参数组合:
- ps -ef:
-
- 功能:以全格式显示所有进程的详细信息。
-
- 步骤:
-
-
- 打开终端。
-
-
-
- 输入 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。
创建进程的步骤
- 包含必要的头文件:#include <unistd.h> 和 #include <stdio.h>。
- 调用 fork 函数创建子进程。
- 根据 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;}
编译和运行步骤
- 把上述代码保存为 fork_example.c。
- 打开终端,进入代码所在目录。
- 使用 gcc 编译代码:gcc fork_example.c -o fork_example。
- 运行编译后的可执行文件:./fork_example。
三、僵尸进程
3.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 形成条件
孤儿进程的形成需要满足以下两个条件:
- 父进程优先于子进程结束。
- 子进程未结束。
当父进程结束后,子进程就会变成孤儿进程,此时它会被进程 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;}
关闭标准输入、标准输出和标准错误输出的文件描述符,防止守护进程与控制终端交互。
编译和运行步骤
- 把上述代码保存为 daemon_example.c。
- 打开终端,进入代码所在目录。
- 使用 gcc 编译代码:gcc daemon_example.c -o daemon_example。
- 运行编译后的可执行文件:./daemon_example。此时,守护进程会在后台持续运行。
通过以上步骤,你可以逐步掌握 Linux 多进程的相关知识,包括进程的创建、僵尸进程和孤儿进程的处理,以及守护进程的实现。在实际应用中,多进程编程可以提高程序的并发性能,充分利用多核 CPU 的资源。
相关文章:
Linux 入门八:Linux 多进程
一、概述 1.1 什么是进程? 在 Linux 系统中,进程是程序的一次动态执行过程。程序是静态的可执行文件,而进程是程序运行时的实例,系统会为其分配内存、CPU 时间片等资源。例如,输入 ls 命令时,系统创建进程…...
学习如何设计大规模系统,为系统设计面试做准备!
前言 在当今快速发展的技术时代,系统设计能力已成为衡量一名软件工程师专业素养的重要标尺。随着云计算、大数据、人工智能等领域的兴起,构建高性能、可扩展且稳定的系统已成为企业成功的关键。然而,对于许多工程师而言,如何有效…...
前端防御性编程
关于防御性编程 你是否遇到过,接口请求失败或者返回数据错误,导致系统白屏或者前端自身写的代码存在一些缺陷,导致整个系统不够健壮,从而导致系统白屏 常见的问题与防范 最常见的问题 访问了null或者undefined的属性 null.a …...
Java工具类-assert断言
我们可能经常在项目的单元测试或者一些源码中看到别人在使用assert关键字,当然也不只是Java语言,很多编程语言也都能看到,我们大概知道断言可以用于测试中条件的校验,但却不经常使用,本文总结了Java中该工具类的使用。…...
215. 数组中的第K个最大元素
1、题目分析 顾名思义。 2.算法原理 利用排序,再找到第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脚本敏感命令进行加密执行
我要加密这条命令:rm /root/scripty.sh 如何利用openssl aes-256-cbc 实现加密和解密,并执行命令 加密、解密并执行命令的完整流程 以下是使用 openssl aes-256-cbc 加密命令 rm /root/scripty.sh,解密并执行的详细步骤: 1. 加密…...
SQL ⑦-索引
索引 索引是一种特殊的数据结构,它帮助数据库系统高效地找到数据。 索引通过一定的规则排列数据表中的记录,使得对表的查询可以通过对索引的搜索来加快速度。 索引好比书籍的目录,能帮助你快速找到相应的章节。 B树 B树是一种经常用于数…...
LinkedBlockingQueue使用场景有哪些
1、LinkedBlockingQueue 的特点 LinkedBlockingQueue 是 Java 中 java.util.concurrent 包下的一种阻塞队列,它有以下几个主要特点: 1.线程安全 LinkedBlockingQueue 是线程安全的,它内部使用了锁机制来确保多线程环境下的并发访问不会导致…...
关于难例损失函数小记
什么是难例损失函数(Hard Example Loss Function) 这玩意儿是深度学习训练中非常重要又很实用的一个概念,特别适用于处理 数据不平衡、模型收敛缓慢、或者**想让模型更“挑剔”**的场景。 🌟 先从名字讲起: “难例”…...
小程序开发指南
小程序开发指南 目录 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,What is RCE? 在CTF(Capture The Flag)竞赛中,RCE漏洞指的是远程代码执行漏洞(Remote Code Execution)。这类漏洞允许攻击者通过某种方式在目标系统上执行任意代码,从而完全控制目…...
青少年编程考试 CCF GESP图形化编程 三级认证真题 2025年3月
图形化编程 三级 2025 年 03 月 一、单选题(共 15 题,每题 2 分,共 30 分) 1、2025 年春节有两件轰动全球的事件,一个是 DeepSeek 横空出世,另一个是贺岁 片《哪吒 2》票房惊人,入了全球票房榜…...
一、绪论(Introduction of Artificial Intelligence)
写在前面: 老师比较看重的点:对问题的概念本质的理解,不会考试一堆运算的东西,只需要将概念理解清楚就可以,最后一个题会出一个综合题,看潜力,前面的部分考的不是很深,不是很难&…...
多模态大语言模型arxiv论文略读(十五)
## Jailbreaking GPT-4V via Self-Adversarial Attacks with System Prompts ➡️ 论文标题:Jailbreaking GPT-4V via Self-Adversarial Attacks with System Prompts ➡️ 论文作者:Yuanwei Wu, Xiang Li, Yixin Liu, Pan Zhou, Lichao Sun ➡️ 研究机…...
漏洞报告:多短视频平台时间差举报滥用漏洞
漏洞标题:跨平台内容发布时序漏洞导致的恶意举报攻击向量 漏洞类型:逻辑缺陷/滥用机制 漏洞等级:中高风险 漏洞描述: 攻击者可利用多平台内容发布时间差,伪造原创证明对合法内容发起恶意举报。该漏洞源于平台间缺乏发…...
【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 月 一、单选题(共 10 题,每题 2 分,共 30 分) 1、2025 年春节有两件轰动全球的事件,一个是 DeepSeek 横空出世,另一个是贺岁片《哪吒 2》票房惊人,入了全球票房榜…...
学习海康VisionMaster之平行线查找
一:进一步学习了 今天学习下VisionMaster中的平行线查找,这个还是拟合直线的衍生应用,可以同时测量两条线段,输出中线 二:开始学习 1:什么是平行线查找? 按照传统的算法,必须是开两…...
小甲鱼第004讲:变量和字符串(下)| 课后测试题及答案
问答题: 0. 请问下面代码有没有毛病,为什么? 请问下面代码为什么会出错,应该如何解决? 答:这是由于在字符串中,反斜杠()会与其随后的字符共同构成转义字符。 为了避免这种不测情况的发生,我们可以在字符串的引号前面…...
2025 蓝桥杯省赛c++B组个人题解
声明 本题解为退役蒻苟所写,不保证正确性,仅供参考。 花了大概2个半小时写完,感觉比去年省赛简单,难度大概等价于 codeforces dv4.5 吧 菜鸡不熟悉树上背包,调了一个多小时 题目旁边的是 cf 预测分 所有代码均以通…...
2025蓝桥杯算法竞赛深度突破:创新题型与高阶策略全解析
一、新型算法范式实战 1.1 元启发式算法应用(预测难度:★★★★) 题目场景:星际货物装载 需在飞船载重限制下选择最优货物组合,引入遗传算法解决NP-Hard问题: 染色体编码:二进制串表示货物选择…...
网络流量管理-流(Flow)
1. 传统网络的问题:快递员送信模式 想象你每天要寄100封信给同一个朋友,传统网络的处理方式就像一个固执的快递员: 每封信都单独处理:检查地址、规划路线、盖章、装车…即使所有信的目的地、收件人都相同,也要重复100…...
Spring Boot对接马来西亚股票数据源API
随着对东南亚市场的兴趣日益增长,获取马来西亚股票市场的实时和历史数据变得尤为重要。本文将指导您如何使用Spring Boot框架对接一个假定的马来西亚股票数据源API(例如,StockTV API),以便开发者能够轻松访问和处理这些…...
MySQL 面经
1、什么是 MySQL? MySQL 是一个开源的关系型数据库,现在隶属于 Oracle 公司。是我们国内使用频率最高的一种数据库,我本地安装的是比较新的 8.0 版本。 1.1 怎么删除/创建一张表? 可以使用 DROP TABLE 来删除表,使用…...
【Flink运行时架构】作业提交流程
本文介绍在单作业模式下Flink提交作业的具体流程,如下图所示。 客户端将作业提交给YARN的RM;YARN的RM启动Flink JobManager,并将作业提交给JobMaster;JobMaster向Flink内置的RM请求slots;Flink内置的RM向YARN RM请求…...
【AutoTest】自动化测试工具大全(Java)
😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 &#x…...
当DRAM邂逅SSD:新型“DRAM+”存储技术来了!
在当今快速发展的科技领域,数据存储的需求日益增长,对存储设备的性能和可靠性提出了更高的要求。传统DRAM以其高速度著称,但其易失性限制了应用范围;而固态硬盘SSD虽然提供非易失性存储,但在速度上远不及DRAM。 为了解…...
【算法】快速排序
算法系列六:快速排序 一、快速排序的递归探寻 1.思路 2.书写 3.搭建 3.1设计过掉不符情况(在最底层时) 3.2查验能实现基础结果(在最底层往上点时) 3.3跳转结果继续往上回搭 4.实质 二、快速排序里的基准排序 …...
Python快速入门指南:从零开始掌握Python编程
文章目录 前言一、Python环境搭建🥏1.1 安装Python1.2 验证安装1.3 选择开发工具 二、Python基础语法📖2.1 第一个Python程序2.2 变量与数据类型2.3 基本运算 三、Python流程控制🌈3.1 条件语句3.2 循环结构 四、Python数据结构🎋…...
机器学习中的数学(PartⅡ)——线性代数:2.1线性方程组
概述: 现实中很多问题都可被建模为线性方程组问题,而线性代数为我们提供了解决这类问题的工具。先看两个例子: 例子1: 一家公司有n个产品,分别是,生产上述产品需要m种原料,每个产品需要其中一…...
大模型上下文协议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 解析库,能够从复杂的网页文档中高效提取数据。以下是其核心知识点及示例代码。 一、库简介 1. 核心模块 BeautifulSoup:主类,用于构建文档树结构Tag:表示 HTML/XML 标签的对象…...
Cuto壁纸 2.6.9 | 解锁所有高清精选壁纸,无广告干扰
Cuto壁纸 App 提供丰富多样的壁纸选择,涵盖动物、风景、创意及游戏动漫等类型。支持分类查找与下载,用户可轻松将心仪壁纸设为手机背景,并享受软件内置的编辑功能调整尺寸。每天更新,确保用户总能找到新鲜、满意的壁纸。 大小&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 开关实现方式大集合
涵盖硬件、软件、工业控制、游戏开发及网络虚拟化场景: 🔌 1. 电子 / 硬件工程 🛠️ (1) 物理替代方案 🧲 跳线帽(Jumper)或短路块 👉 模拟开关“开/关”状态 ✅ 示例:开发板上的 B…...
深度解析基于 Web Search MCP的Deep Research 实现逻辑
写在前面 大型语言模型(LLM)已成为我们获取信息、生成内容的重要工具。但它们的知识大多截止于训练数据的时间点,对于需要实时信息、跨领域知识整合、多角度观点比较的深度研究 (Deep Research) 任务,它们往往力有不逮。如何让 LLM 突破自身知识的局限,像人类研究员一样,…...
set 的 contains
语法: set<int> num_set; st.contains(num); 在 C 中,!num_set.contains(num - 1) 这行代码通常用于检查一个集合(num_set)中是否不存在某个值(num - 1)。以下是对这行代码的详细解释:…...
深度学习总结(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实现多态的重要机制,核心价值体现在: 实现多继承能力:突破单继承限制,允许类实现多个接口规范系统解耦:制定通用标准,隔离实现与调用方增强扩展性…...
VitePress 项目部署 cloudflare page 提示 npm run build 错误
构建的错误信息如下: 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 模式
📌 一、概念对比:Hash 模式 vs History 模式 特性Hash 模式History 模式URL 样式http://example.com/#/homehttp://example.com/home是否刷新页面❌ 不会刷新(仅 hash 变化)✅ 通过 HTML5 API 控制,不刷新原理window.…...
图像融合(Image Fusion)是什么
图像融合(Image Fusion)将来自相同类型传感器或成像方式的多幅图像(通常内容是一样的)进行融合,提高图像清晰度、对比度、空间或时间分辨率。得到比原始图像更清晰或信息更丰富的图像 常见类型: 多时相图…...
基于YOLOV8的中草药识别检测系统(包含数据集+PyQt5界面+系统代码)
一、简介 本项目构建了基于 YOLOV8 深度学习网络模型的中草药识别检测系统。凭借 YOLOV8 卓越的性能,该系统能够高效、精准地识别检测大枣、 百合、黄连 、乌梅、厚朴 、牡蛎 、海马 、罗汉果 、甘草、三七、 通草、 薏苡仁、 枸杞子 、八角茴香等 50种常见植物中草…...
【愚公系列】《高效使用DeepSeek》066-纠纷解决话术
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...