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

【Linux系统编程】—— 进程替换及其在操作系统中的应用与实现

文章目录

  • 什么是进程替换?
  • 进程替换当中的接口
  • 单进程替换
  • 多进程的替换
  • 详解exec接口
    • execl
    • execlp
    • execv

前言: 本篇博客将深入探讨进程替换的概念及其在操作系统中的作用。我们将介绍进程替换的基本原理,探讨操作系统如何通过进程的切换来实现任务管理,并分析进程替换对系统性能的影响。此外,博客还将结合实际的操作系统调度算法,分析不同进程替换策略的优劣,以及如何在复杂的环境中做出最优的替换决策。

什么是进程替换?

一张图片先了解大概其原理:
单进程替换
在这里插入图片描述
这张图描述了操作系统在进程替换过程中如何通过 PCB 保存进程的状态、如何管理进程的内存(如代码段、数据段和页表)、以及如何将这些信息存储到磁盘中,并在需要时进行恢复。通过这个过程,操作系统能够实现多任务处理,并确保每个进程在切换后能够从正确的地方继续执行。
多进程替换

即根据父进程创建出子进程(拷贝父进程)
在这里插入图片描述
然后程序替换子进程

进程替换当中的接口

在这里插入图片描述
使用man手册之后可以看到其详细的内容:
在这里插入图片描述
上面这些函数接口(由语言封装)把一个文件(可执行程序)替换程当前进程。 他们的作用都是进行 进程替换而准备的,接口的详细说明下文见。

单进程替换

单进程其替换的过程示例:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>// 模拟进程的状态
typedef enum {RUNNING,WAITING,COMPLETED
} ProcessState;// 进程结构体
typedef struct {ProcessState state;  // 当前进程的状态ProcessState saved_state;  // 保存的进程状态
} Process;// 模拟进程运行
void run_process(Process* process) {printf("进程开始运行...\n");sleep(1);  // 模拟一些处理(例如计算)// 模拟 I/O 等待io_wait(process);
}// 模拟 I/O 等待过程
void io_wait(Process* process) {printf("进程进入 I/O 等待...\n");save_state(process);  // 保存当前进程的状态// 模拟 I/O 操作,例如磁盘读取,等待 3 秒sleep(3);printf("磁盘读取完成,恢复进程...\n");restore_state(process);  // 恢复进程的状态// 继续执行finalize_process(process);
}// 保存进程状态
void save_state(Process* process) {printf("保存进程状态...\n");process->saved_state = process->state;  // 保存当前进程的状态process->state = WAITING;  // 将当前进程设置为等待状态
}// 恢复进程状态
void restore_state(Process* process) {printf("恢复进程状态...\n");process->state = process->saved_state;  // 恢复到之前的状态process->saved_state = RUNNING;  // 清空保存的状态
}// 结束进程
void finalize_process(Process* process) {printf("进程继续执行并结束。\n");process->state = COMPLETED;  // 进程执行完毕,设置为完成状态
}int main() {// 创建并初始化进程Process process = {RUNNING, RUNNING};// 执行进程run_process(&process);return 0;
}
进程开始运行...
进程进入 I/O 等待...
保存进程状态...
磁盘读取完成,恢复进程...
恢复进程状态...
进程继续执行并结束。

这个 C 语言程序模拟了一个单进程环境中的“进程替换”过程。尽管系统只有一个进程,但通过保存和恢复状态,我们可以模拟进程被暂停(例如等待 I/O 完成)并恢复执行的过程。虽然这种机制在实际多进程环境中更为常见,但在单进程系统中,操作系统仍然会通过这种方式管理进程的执行。

多进程的替换

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>// 模拟进程的状态
typedef enum {RUNNING,WAITING,COMPLETED
} ProcessState;// 进程结构体
typedef struct {ProcessState state;  // 当前进程的状态ProcessState saved_state;  // 保存的进程状态
} Process;// 模拟进程运行
void run_process(Process* process) {printf("进程开始运行...\n");sleep(1);  // 模拟一些处理(例如计算)// 模拟 I/O 等待io_wait(process);
}// 模拟 I/O 等待过程
void io_wait(Process* process) {printf("进程进入 I/O 等待...\n");save_state(process);  // 保存当前进程的状态// 模拟 I/O 操作,例如磁盘读取,等待 3 秒sleep(3);printf("磁盘读取完成,恢复进程...\n");restore_state(process);  // 恢复进程的状态// 继续执行finalize_process(process);
}// 保存进程状态
void save_state(Process* process) {printf("保存进程状态...\n");process->saved_state = process->state;  // 保存当前进程的状态process->state = WAITING;  // 将当前进程设置为等待状态
}// 恢复进程状态
void restore_state(Process* process) {printf("恢复进程状态...\n");process->state = process->saved_state;  // 恢复到之前的状态process->saved_state = RUNNING;  // 清空保存的状态
}// 结束进程
void finalize_process(Process* process) {printf("进程继续执行并结束。\n");process->state = COMPLETED;  // 进程执行完毕,设置为完成状态
}int main() {pid_t pid;Process process = {RUNNING, RUNNING};// 创建一个子进程pid = fork();if (pid == -1) {// 创建进程失败perror("fork失败");exit(1);}else if (pid == 0) {// 子进程部分printf("子进程开始运行...\n");run_process(&process);  // 运行进程exit(0);  // 子进程结束}else {// 父进程部分wait(NULL);  // 等待子进程结束printf("父进程继续运行...\n");run_process(&process);  // 父进程继续运行// 等待所有子进程结束wait(NULL);}return 0;
}
子进程开始运行...
进程开始运行...
进程进入 I/O 等待...
保存进程状态...
磁盘读取完成,恢复进程...
恢复进程状态...
进程继续执行并结束。
父进程继续运行...
进程开始运行...
进程进入 I/O 等待...
保存进程状态...
磁盘读取完成,恢复进程...
恢复进程状态...
进程继续执行并结束。

详解exec接口

在这里插入图片描述
再看这些接口

execl

下面这个图片作为示例:
在这里插入图片描述
在执行一个程序时,第一件事确实是要找到这个程序。因此,execl 函数的第一个参数就是该程序的路径,通常是一个绝对路径(当然,相对路径也可以,但是在某些情况下执行命令时可能会受到路径的限制)。当操作系统定位到这个程序后,它需要确定以什么方式执行该程序以及传递哪些参数。因此,execl 中的第二个及后续参数就是传递给程序的选项或参数。

这些参数的形式类似于一个链表,每个选项或参数都通过一个指针传递,而链表的结尾通过一个特殊的 NULL 值来标识,以此来区分链表的末尾。这是因为,execl 必须知道何时停止读取选项,从而确保不会读取到无效或不必要的内容。因此,最后一个选项或参数必须显式设置为 NULL,这是标准的约定。

execlp

execlp 函数与 execl 函数非常相似,但有一个重要的不同点:它会在指定路径的基础上搜索系统的 PATH 环境变量。这意味着,execlp 允许我们只提供程序的名称(不需要完整的路径),操作系统会自动在 PATH 中查找该程序。

#include <stdio.h>
#include <unistd.h>int main() {// 使用 execlp 执行程序 lsexeclp("ls", "ls", "-l", "/home", NULL);// 如果 execlp 执行失败,则打印错误信息perror("execlp failed");return 0;
}

解释:

  • 第一个参数 (“ls”):程序的名称。execlp 会在系统的 PATH 环境变量中搜索该程序,并执行找到的程序。
  • 后续参数 (“ls”, “-l”, “/home”, NULL):这些是传递给 ls 程序的选项。第一个 “ls” 参数是程序名,后续的 “-l” 和 “/home” 是选项或参数,告诉 ls 以长列表的格式显示 /home 目录下的内容。最后一个 NULL 用于标识参数链表的结束。

在执行一个程序时,第一步仍然是要找到这个程序。对于 execlp,与 execl 的不同之处在于,execlp 并不需要我们指定程序的绝对路径(虽然可以提供),而是只需要提供程序的名称。操作系统会根据系统的 PATH 环境变量,自动搜索并找到该程序。

因此,execlp 函数的第一个参数是要执行的程序名称(或者路径),操作系统会在 PATH 环境变量中依次查找该程序。如果提供的是相对路径或者只提供文件名,操作系统会按照 PATH 中定义的搜索路径进行查找。

execv

在执行一个程序时,第一步仍然是要找到这个程序。与 execlv 相似,execv 需要我们提供程序的 路径 和 参数数组。execv 的第一个参数是要执行的程序的完整路径或相对路径,后续参数是传递给程序的选项和参数,这些选项和参数通过一个数组来传递。数组的最后一个元素必须是 NULL,用来标识参数的结束。

#include <stdio.h>
#include <unistd.h>int main() {// 创建一个参数数组char *args[] = {"ls", "-l", "/home", NULL};// 使用 execv 执行程序 /bin/lsexecv("/bin/ls", args);// 如果 execv 执行失败,则打印错误信息perror("execv failed");return 0;
}

解释:

  • 第一个参数 (“/bin/ls”):这是程序的完整路径。execv 不会在 PATH 环境变量中查找程序,因此必须提供程序的 绝对路径 或 相对路径。在这个例子中,路径是 /bin/ls,表示我们要执行 ls 命令。

  • 第二个参数 (args):这是一个包含程序名和所有传递给程序的参数的数组。这个数组中的第一个元素通常是程序的名称(这里是 “ls”),后面的元素是传递给该程序的参数,最后一个元素必须是 NULL,以标识数组的结束。

相关文章:

【Linux系统编程】—— 进程替换及其在操作系统中的应用与实现

文章目录 什么是进程替换&#xff1f;进程替换当中的接口单进程替换多进程的替换详解exec接口execlexeclpexecv 前言&#xff1a; 本篇博客将深入探讨进程替换的概念及其在操作系统中的作用。我们将介绍进程替换的基本原理&#xff0c;探讨操作系统如何通过进程的切换来实现任务…...

“裸奔”时代下该如何保护网络隐私

网络隐私的保护之道 引言 在这个信息爆炸的时代&#xff0c;网络已经深入到我们生活的每一个角落。你是否曾想过&#xff0c;在享受这些便利时&#xff0c;你的个人隐私正面临着严峻的挑战&#xff1f;网络隐私的现状警示着我们&#xff0c;信息泄露的事件屡见不鲜&#xff0…...

分类问题(二元,多元逻辑回归,费歇尔判别分析)spss实操

分类模型&#xff1a; 二分类和多分类&#xff1a; 对于二分类模型 &#xff0c;我们将介绍逻辑回归和Fisher线性判别分析两种分类算法; 对于多分类模型&#xff0c;我们将简单介绍Spss中的多分类线性判别分析和多分类逻辑回归的操作步骤 二分类: 基于广义线性模型&#x…...

推荐一个开源的轻量级任务调度器!TaskScheduler!

大家好&#xff0c;我是麦鸽。 这次推荐一款轻量级的嵌入式任务调度器&#xff0c;目前已经有1.4K的star&#xff0c;这个项目比较轻量化&#xff0c;只有5个源文件&#xff0c;可以作为学习的一个开源项目。 核心文件 项目概述&#xff1a; 这是一个轻量级的协作式多任务处理&…...

Spring 核心技术解析【纯干货版】- IV:Spring 切面编程模块 Spring-Aop 模块精讲

随着软件开发技术的不断进步&#xff0c;面向切面编程&#xff08;AOP&#xff09;作为一种重要的编程思想&#xff0c;已经在现代开发中占据了重要地位。它通过将横切逻辑从业务逻辑中分离出来&#xff0c;使得代码更加清晰、易于维护。Spring AOP 作为 Spring 框架的核心模块…...

STM32之FreeRTOS开发介绍(十九)

STM32F407 系列文章 - freertos&#xff08;十九&#xff09; 目录 前言 一、简述 二、开源网址 三、原理及功能特性 1.原理简介 2.功能介绍 1.任务调度 2.任务管理 3.中断管理 4.消息队列 3.特点说明 4.优缺点 四、参考书籍 五、实现方式 总结 前言 FreeRTOS是…...

2024年美赛C题评委文章及O奖论文解读 | AI工具如何影响数学建模?从评委和O奖论文出发-O奖论文做对了什么?

模型假设仅仅是简单陈述吗&#xff1f;允许AI的使用是否降低了比赛难度&#xff1f;还在依赖机器学习的模型吗&#xff1f;处理题目的方法有哪些&#xff1f;O奖论文的优点在哪里&#xff1f; 本文调研了当年赛题的评委文章和O奖论文&#xff0c;这些问题都会在文章中一一解答…...

第14篇:从入门到精通:掌握python上下文管理器

第14篇&#xff1a;上下文管理器 内容简介 本篇文章将深入探讨Python中的上下文管理器&#xff08;Context Manager&#xff09;。您将了解上下文管理器的概念与用途&#xff0c;学习如何实现自定义的上下文管理器&#xff0c;以及如何使用contextlib模块来简化上下文管理器的…...

cuda从零开始手搓PB神经网络

cuda实现PB神经网络 基于上一篇的矩阵点乘&#xff0c;实现了矩阵的加减乘除、函数调用等。并且复用之前元编程里面写的梯度下降、Adam、NAdam优化方法。实现PB神经网络如下&#xff1a; #ifndef __BP_NETWORK_HPP__ #define __BP_NETWORK_HPP__ #include "matrix.hpp&quo…...

Java 大视界 -- Java 大数据物联网应用:数据处理与设备管理(八)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

大模型之三十三- 开源Melo 语音合成

大模型之三十三- 开源Melo 语音合成 文本到语音(TTS)系统从基于基础音素的模型演变成复杂的端到端神经方法,这种方法可以直接将文本转换为语音。这一变革得益于深度学习的进步和计算能力的提升,已经在语音的自然度、韵律控制和跨语言能力方面取得了重大进展 。现代TTS系统…...

全同态加密理论、生态现状与未来展望(上)

《全同态加密理论、生态现状与未来展望》系列由lynndell2010gmail.com和mutourend2010gmail.com整理原创发布&#xff0c;分为上中下三个系列&#xff1a; 全同态加密理论、生态现状与未来展望&#xff08;上&#xff09;&#xff1a;专注于介绍全同态加密理论知识。全同态加密…...

cursor重构谷粒商城02——30分钟构建图书管理系统【cursor使用教程番外篇】

前言&#xff1a;这个系列将使用最前沿的cursor作为辅助编程工具&#xff0c;来快速开发一些基础的编程项目。目的是为了在真实项目中&#xff0c;帮助初级程序员快速进阶&#xff0c;以最快的速度&#xff0c;效率&#xff0c;快速进阶到中高阶程序员。 本项目将基于谷粒商城…...

提升大语言模型的三大策略

1.概述 随着大语言模型&#xff08;LLMs&#xff09;在技术和应用上的不断发展&#xff0c;它们已经深刻地改变了我们与计算机的互动方式。从文本生成到语言理解&#xff0c;LLMs的应用几乎涵盖了各个行业。然而&#xff0c;尽管这些模型已展现出令人印象深刻的能力&#xff0c…...

Ubuntu 24.04 LTS 安装 Docker Desktop

Docker 简介 Docker 简介和安装Ubuntu上学习使用Docker的详细入门教程Docker 快速入门Ubuntu版&#xff08;1h速通&#xff09; Docker 安装 参考 How to Install Docker on Ubuntu 24.04: Step-by-Step Guide。 更新系统和安装依赖 在终端中运行以下命令以确保系统更新并…...

mysql查看binlog日志

mysql 配置、查看binlog日志&#xff1a; 示例为MySQL8.0 1、 检查binlog开启状态 SHOW VARIABLES LIKE ‘log_bin’; 如果未开启&#xff0c;修改配置my.ini 开启日志 安装目录配置my.ini(mysql8在data目录) log-binmysql-bin&#xff08;开启日志并指定日志前缀&#xff…...

2. Flink分区策略

一. Flink分区策略概述 Flink任务在执行过程中&#xff0c;一个流(stream)包含一个或多个分区(Stream partition)&#xff0c;TaskManager中的一个slot的SubTask就是一个stream partition(流分区)。 Flink分区之间进行数据传递模式有两种。 1. one-to-one模式 数据不需要重新…...

Qt 5.14.2 学习记录 —— 십칠 窗口和菜单

文章目录 1、Qt窗口2、菜单栏设置快捷键添加子菜单添加分割线和菜单图标 3、工具栏 QToolBar4、状态栏 QStatusBar5、浮动窗口 QDockWidget 1、Qt窗口 QWidget&#xff0c;即控件&#xff0c;是窗口的一部分。在界面中创建控件组成界面时&#xff0c;Qt自动生成了窗口&#xf…...

微信小程序中实现背景图片完全覆盖显示,可以通过设置CSS样式来实现

wxml页面代码 <view class"beijing"></view>wxss样式代码 /* pages/beiJing/beiJing.wxss */ .beijing {background-image: url("https://www.qipa250.com/qipa.jpg");/* 定位&#xff1a;绝对定位 */position: absolute;/* 上下左右都定位到…...

亲测有效!如何快速实现 PostgreSQL 数据迁移到 时序数据库TDengine

小T导读&#xff1a;本篇文章是“2024&#xff0c;我想和 TDengine 谈谈”征文活动的优秀投稿之一&#xff0c;作者从数据库运维的角度出发&#xff0c;分享了利用 TDengine Cloud 提供的迁移工具&#xff0c;从 PostgreSQL 数据库到 TDengine 进行数据迁移的完整实践过程。文章…...

中国综合算力指数(2024年)报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p39061 在全球算力因数字化技术发展而竞争加剧&#xff0c;我国积极推进算力发展并将综合算力作为数字经济核心驱动力的背景下&#xff0c;该报告对我国综合算力进行研究。 中国算力大会发布的《中国综合算力指数&#xff08;2024年…...

51c~ONNX~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/11608027 一、使用Pytorch进行简单的自定义图像分类 ~ONNX 推理 图像分类是计算机视觉中的一项基本任务&#xff0c;涉及训练模型将图像分类为预定义类别。本文中&#xff0c;我们将探讨如何使用 PyTorch 构建一个简单的自定…...

线下陪玩系统架构与功能分析

2015工作至今&#xff0c;10年资深全栈工程师&#xff0c;CTO&#xff0c;擅长带团队、攻克各种技术难题、研发各类软件产品&#xff0c;我的代码态度&#xff1a;代码虐我千百遍&#xff0c;我待代码如初恋&#xff0c;我的工作态度&#xff1a;极致&#xff0c;责任&#xff…...

海康工业相机的应用部署不是简简单单!?

作者&#xff1a;SkyXZ CSDN&#xff1a;SkyXZ&#xff5e;-CSDN博客 博客园&#xff1a;SkyXZ - 博客园 笔者使用的设备及环境&#xff1a;WSL2-Ubuntu22.04MV-CS016-10UC 不会吧&#xff1f;不会吧&#xff1f;不会还有人拿到海康工业相机还是一脸懵叭&#xff1f;不会还有人…...

SAP POC 项目完工进度 - 收入确认方式【工程制造行业】【新准则下工程项目收入确认】

1. SAP POC收入确认基础概念 1.1 定义与原则 SAP POC&#xff08;Percentage of Completion&#xff09;收入确认方式是一种基于项目完工进度来确认收入的方法。其核心原则是根据项目实际完成的工作量或成本投入占预计总工作量或总成本的比例&#xff0c;来确定当期应确认的收…...

【Elasticsearch 】 聚合分析:聚合概述

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

【算法】二分

二分 1.二分查找1.在排序数组中查找元素的第一个和最后一个位置2.牛可乐和魔法封印3.A-B 数对4.烦恼的高考志愿 2.二分答案1.木材加工2.砍树3.跳石头 1.二分查找 当我们的解具有二段性&#xff08;根据最终答案所在的位置判断是否具有二段性&#xff09;时&#xff0c;就可以使…...

如何将自己本地项目开源到github上?

环境&#xff1a; LLMB项目 问题描述&#xff1a; 如何将自己本地项目开源到github上&#xff1f; 解决方案&#xff1a; 步骤 1: 准备本地项目 确保项目整洁 确认所有的文件都在合适的位置&#xff0c;并且项目的 README.md 文件已经完善。检查是否有敏感信息&#xff0…...

编辑器Vim基本模式和指令 --【Linux基础开发工具】

文章目录 一、编辑器Vim 键盘布局二、Linux编辑器-vim使用三、vim的基本概念正常/普通/命令模式(Normal mode)插入模式(Insert mode)末行模式(last line mode) 四、vim的基本操作五、vim正常模式命令集插入模式从插入模式切换为命令模式移动光标删除文字复制替换撤销上一次操作…...

Scade 表达式 - 使用索引的迭代器

Scade 表达式中的 map, fold, mapfold&#xff0c;会对输入数组参数中的元素逐个作处理&#xff0c;不需要数组元素的索引信息。若在处理数组元素时&#xff0c;需要数组元素相应的索引信息&#xff0c;则可使用迭代器算子 mapi, foldi, mapfoldi。 mapi 算子 mapi 算子的行为…...

K8s学习

Kubernetes 1. Kubernetes介绍 1.1 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xf…...

面试--你的数据库中密码是如何存储的?

文章目录 三种分类使用 MD5 加密存储加盐存储Base64 编码:常见的对称加密算法常见的非对称加密算法https 传输加密 在开发中需要存储用户的密码&#xff0c;这个密码一定是加密存储的&#xff0c;如果是明文存储那么如果数据库被攻击了&#xff0c;密码就泄露了。 我们要对数据…...

微服务学习-快速搭建

1. 速通版 1.1. git clone 拉取项目代码&#xff0c;导入 idea 中 git clone icoolkj-microservices-code: 致力于搭建微服务架构平台 1.2. git checkout v1.0.1版本 链接地址&#xff1a;icoolkj-microservices-code 标签 - Gitee.com 2. 项目服务结构 3. 实现重点步骤 …...

兼职全职招聘系统架构与功能分析

2015工作至今&#xff0c;10年资深全栈工程师&#xff0c;CTO&#xff0c;擅长带团队、攻克各种技术难题、研发各类软件产品&#xff0c;我的代码态度&#xff1a;代码虐我千百遍&#xff0c;我待代码如初恋&#xff0c;我的工作态度&#xff1a;极致&#xff0c;责任&#xff…...

【云岚到家】-day03-门户缓存实现实战

【云岚到家】-day03-门户缓存实现实战 1.定时任务更新缓存 1.1 搭建XXL-JOB环境 1.1.1 分布式调度平台XXL-JOB介绍 对于开通区域列表的缓存数据需要由定时任务每天凌晨更新缓存&#xff0c;如何实现定时任务呢&#xff1f; 1.使用jdk提供的Timer定时器 示例代码如下&#xf…...

Ubuntu 24.04 LTS 开启 SMB 服务,并通过 windows 访问

Ubuntu 24.04 LTS 背景资料 Ubuntu服务器折腾集Ubuntu linux 文件权限Ubuntu 空闲硬盘挂载到 文件管理器的 other locations Ubuntu开启samba和window共享文件 Ubuntu 配置 SMB 服务 安装 Samba 确保 Samba 已安装。如果未安装&#xff0c;运行以下命令进行安装&#xff…...

“AI人工智能内容辅助创作平台:让创意不再“卡壳”

在如今这个信息爆炸的时代&#xff0c;内容创作成了每个人的“必修课”。无论是自媒体大V、文案策划&#xff0c;还是普通学生写作文&#xff0c;大家都会遇到一个让人抓狂的问题——“创意枯竭”。有时候&#xff0c;脑袋里空空如也&#xff0c;一个字都写不出来&#xff0c;那…...

mac 安装 node

brew versions node // 安装 node brew versions node14 // 安装指定版本 卸载node: sudo npm uninstall npm -g sudo rm -rf /usr/local/lib/node /usr/local/lib/node_modules /var/db/receipts/org.nodejs.* sudo rm -rf /usr/local/include/node /Users/$USER/.npm su…...

VUE之Router使用及工作模式

1、路由的使用 【两个注意点】 1)路由组件通常放在pages 或 views文件夹,一般组件通常放在components文件夹。 2)通过点击导航,视觉效果上"消失"了的路由组件,默认是被"卸载"掉的,需要的时候再去挂载。 // 创建一个路由器,并暴露出去// 第一步:…...

day25_HTML

今日内容 零、 复习昨日 一、HTML 零、 复习昨日 一、Web开发 前端 HTML ,页面展现CSS , 样式JS (JavaScript) , 动起来 二、HTML 2.1 HTML概念 ​ 网页&#xff0c;是网站中的一个页面&#xff0c;通常是网页是构成网站的基本元素&#xff0c;是承载各种网站应用的平台。通俗…...

(开源)基于Django+Yolov8+Tensorflow的智能鸟类识别平台

1 项目简介&#xff08;开源地址在文章结尾&#xff09; 系统旨在为了帮助鸟类爱好者、学者、动物保护协会等群体更好的了解和保护鸟类动物。用户群体可以通过平台采集野外鸟类的保护动物照片和视频&#xff0c;甄别分类、实况分析鸟类保护动物&#xff0c;与全世界各地的用户&…...

【AI日记】25.01.20

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛&#xff1a;Forecasting Sticker Sales 读书 书名&#xff1a;自由宪章阅读原因&#xff1a;作者哈耶克&#xff0c;诺贝尔经济学奖得主&#xff0c;之前读过他的 《通往奴役…...

基于机器学习的用户健康风险分类及预测分析

完整源码项目包获取→点击文章末尾名片&#xff01; 背景描述 在这个日益注重健康与体能的时代&#xff0c;健身已成为许多人追求健康生活的重要组成部分。 本数据集包含若干健身房会员的详细信息&#xff0c;包括年龄、性别、体重、身高、心率、锻炼类型、身体脂肪比例等多项关…...

AI生成内容——JavaScript中的Promise、async和wait

一、Promise *1. 概念&#xff1a; Promise 是 JavaScript 中处理异步操作的一种对象&#xff0c;它表示一个异步操作的最终完成&#xff08;或失败&#xff09;及其结果值。一个 Promise 对象处于以下三种状态之一&#xff1a; Pending&#xff08;进行中&#xff09;&#…...

Java基于SSM框架的社区团购系统小程序设计与实现(附源码,文档,部署)

Java基于SSM框架的社区团购系统小程序设计与实现 博主介绍&#xff1a;✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f4…...

Git原理与应用(三)【远程操作 | 理解分布式 | 推送拉取远程仓库 | 标签管理】

Git 理解分布式版本控制系统远程仓库新建远程仓库克隆远程仓库向远程仓库推送配置Git忽略特殊文件 标签管理理解标签创建标签操作标签删除标签 理解分布式版本控制系统 我们⽬前所说的所有内容&#xff08;工作区&#xff0c;暂存区&#xff0c;版本库等等&#xff09;&#x…...

【esp32小程序】小程序篇02——连接git

一、创建仓库 进入gitee官网&#xff0c;登录&#xff08;如果没有gitee账号的就自行注册一下&#xff09;。 点击号-->新建仓库 填写好必填信息&#xff0c;然后点击“创建” 二、微信开发者工具配置 在微信开发者工具打开我们的项目。按下面的步骤依次点击 三、验证 点…...

MongoDB基本操作

一、实验目的 1. 熟悉MongoDB的基本操作&#xff0c;包括CRUD&#xff08;增加、读取、更新、删除&#xff09;。 2. 理解MongoDB的文档型数据库特性和Shell的使用。 3. 培养学生通过命令行操作数据库的能力。 4. 强化数据库操作的实际应用能力。 二、实验环境准备 1.…...

Brooks MagnaTran LEAP User Manual 指导半导体机械手

Brooks MagnaTran LEAP User Manual 指导半导体机械手...

【Red Hat8】:搭建DHCP服务器

1、新建挂载文件 2、挂载 3、关闭防火墙 4、搭建yum源 &#xff08;搭建的时候用vim 自行定义文件名.repo或者是vi 自行定义文件名.repo&#xff09; 5、安装dhcp-server 6、复制模板文件 dhcpd.conf 是DHCP服务的配置文件&#xff0c;DHCP服务所有参数都是通过修改dhcpd.co…...