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

Linux系统编程---exec簇:进程的加载与替换

1、exec簇基础

        在Linux中,用于加载并执行指定程序的API有exec簇和system函数。

        exec簇的进程替换不会创建一个新的进程,只是加载新的程序代码和数据,替换当前进程执行的程序代码。

        system函数的进程替换是创建一个新的子进程,然后在新的子进程里面去执行指定的命令。

上图这个图片就是exec簇中的全部的函数原型:

  • 主要功能:给进程加载指定的程序,如果成功进程的整个内存空间都会被覆盖
  • 接口解析:

     ①、执行指定程序之后,会自动获取原来的进程的环境变量。

     ②、可以观察到,上面的exec簇的各个函数的后缀是有特定含义的,其中:

        l : list 以列表的方式来组织指定程序的参数

        p: 指的是PATH环境变量,意味着执行程序时可指定搜索环境变量PATH的路径

        e: environment 环境变量,在执行指定程序前,同时设置环境变量

        v: vector 矢量、数组,以数组的方式来组织指定程序的参数

      ③、上面的这组函数只是改变了进程的内存空间里面的代码和数据,但是没有改变这个进程的其它属性

2、exec簇API详细说明

(1)、整体描述

        在exec簇中,包含了多个函数,它们的区别主要在于传递参数的方式和环境变量的处理方式。在Linux系统中,可以通过man手册查询到exec函数簇的说明与使用:man 3 exec。但内容较多,不方便理解和抓住核心重点。

        以 execl(const char *path, const char *arg, ...) 来说,参数path是要加载的指定程序,而arg是该程序运行是的命令行参数,需要注意的是,命令行参数包括了程序名本身,并且全部是字符串。

Snail@ubuntu:$ ./a.out 123 abc

        上面的这个命令用execl来表示就是:

execl("./a.out", "./a.out", "123", "abc", NULL);

        上面的命令和代码中:

①、第一个./a.out是程序本身,第二个./a.out是第一个参数。

②、参数列表以NULL结尾。

注意:只要进程 被exec族替换掉之后,在exec函数之后的原先程序的代码都不会执行!!!

        exec簇的每个API具体使用介绍如下所示:

(2)、execl

//函数原型:
#include <unistd.h>
extern char **environ;int execl(const char *pathname, const char *arg, .../* (char  *) NULL */);//函数功能:
系统调用函数,用于在当前进程的上下文中执行一个新的程序。//参数说明:
pathname:目标程序的路径名,支持绝对路径和相对路径。
arg:传递给新程序的第一个命令行参数,一般是程序的名称。
...:这是可变参数列表,代表传递给新程序的其他命令行参数。参数列表必须以 NULL 结尾,以此来表明参数列表结束。//返回值:
成功无返回值
失败返回-1,并通过errno说明错误原因//使用示范:
execl("./a.out", "b.out", "abcd", NULL);

(3)、execv

//函数原型:
#include <unistd.h>
extern char **environ;int execv(const char *pathname, char *const argv[]);  //vector//函数功能:
系统调用函数,用于在当前进程的上下文中执行一个新的程序。//参数说明:
pathname:目标程序的路径名,支持绝对路径和相对路径。
arg:指针数组,数组中的每个元素都是指向以空字符结尾的字符串的指针,这些字符串是传递给新程序的命令行参数。
数组的最后一个元素必须为 NULL,以此来表示参数列表的结束。//返回值:
成功无返回值
失败返回-1,并通过errno说明错误原因//使用示范:
char *const argv[ ] = {"hello","1.c","2.c",NULL};
execv("./hello", argv);

(4)、execlp

//函数原型:
#include <unistd.h>
extern char **environ;int execlp(const char *file, const char *arg, .../* (char  *) NULL */);//函数功能:
系统调用函数,用于在当前进程的上下文中执行一个新的程序。//参数说明:
file: 要执行的程序的文件名。execlp 会先在当前目录查找该文件,如果没找到,会根据环境变量 PATH 中指定的路径来查找该可执行文件。
arg:传递给新程序的第一个命令行参数,通常是程序的名称。
...: 可变参数列表,代表传递给新程序的其他命令行参数。参数列表必须以 NULL 结尾,以此来表明参数列表结束。//返回值:
成功无返回值
失败返回-1,并通过errno说明错误原因//使用示范:
//调用 execlp 函数执行 ls -l 命令
execlp("ls", "ls", "-l", NULL);

(5)、execle

//函数原型:
#include <unistd.h>
extern char **environ;int execle(const char *pathname, const char *arg, .../*, (char *) NULL, char *const envp[] */);
//函数功能:
在当前进程的上下文里执行新程序,同时可以自定义新程序的环境变量。//参数说明:
pathname: 目标程序的路径名,支持绝对路径和相对路径。
arg: 传递给新程序的第一个命令行参数,通常为程序的名称。
...: 可变参数列表,代表传递给新程序的其他命令行参数。参数列表需以 NULL 结尾,以此来表明参数列表结束。
envp: 指针数组,数组中的每个元素都是指向以空字符结尾的字符串的指针,这些字符串代表传递给新程序的环境变量。数组的最后一个元素必须为 NULL。//返回值:
成功无返回值
失败返回-1,并通过errno说明错误原因//使用示范:
//使用 execle 函数来执行一个新程序并传递自定义的环境变量:const char *path = "/usr/bin/env";    // 定义要执行的程序的路径
char *const args[] = {    // 定义传递给程序的参数"env",NULL
};
char *const env[] = {     // 定义自定义的环境变量"MY_VAR=my_value",NULL
};// 调用 execle 函数执行程序
execle(path, args[0], NULL, env);

(6)、execvp

//函数原型:
#include <unistd.h>
extern char **environ;int execvp(const char *file, char *const argv[]);//函数功能:
在当前进程的上下文中执行新程序,并且会根据环境变量 PATH 查找可执行文件。//参数说明:
file: 要执行的程序的文件名。execvp 会先在当前目录查找该文件,如果未找到,会依据环境变量 PATH 所指定的路径去查找可执行文件。
argv: 这是一个指针数组,数组中的每个元素都是指向以空字符结尾的字符串的指针,这些字符串是传递给新程序的命令行参数。数组的最后一个元素必须为 NULL,以此表示参数列表的结束。//返回值:
成功无返回值
失败返回-1,并通过errno说明错误原因//使用示范:
char *const argv[ ] = {"ls","-l","demo.c",NULL};
int ret = execvp("ls", argv);
if(ret == -1)
{perror("execvp error");
}

(7)、execvpe

//函数原型:
#include <unistd.h>
extern char **environ;int execvpe(const char *file, char *const argv[],
char *const envp[]);//函数功能:
系统调用函数,用于在当前进程的上下文中执行一个新的程序。
这个函数结合了 execvp 和 execle 的特点,既可以根据环境变量 PATH 来查找可执行文件,又可以自定义新程序的环境变量。//参数说明:
file: 要执行的程序的文件名。execvpe 会先在当前目录查找该文件,如果没找到,会根据环境变量 PATH 中指定的路径来查找可执行文件。
argv: 指针数组,数组中的每个元素都是指向以空字符结尾的字符串的指针,这些字符串是传递给新程序的命令行参数。数组的最后一个元素必须为 NULL,以此表示参数列表的结束。
envp: 指针数组,数组中的每个元素都是指向以空字符结尾的字符串的指针,这些字符串代表传递给新程序的环境变量。数组的最后一个元素必须为 NULL。//返回值:
成功无返回值
失败返回-1,并通过errno说明错误原因//使用示范:
//execvpe 不仅仅会去PATH环境变量路径下寻找程序,还会去指定的路径envp下寻找
char *const argv[ ] = {"hello","1.c","2.c",NULL};
char *const envp[ ] = {"./"};
execvpe("./hello",argv,envp);

3、exec簇程序应用举例

        要求:写一个程序,这个程序创建一个子进程后,子进程打印haha,然后监控键盘,通过键盘的参数去启动另外一个程序,比如键盘输入 hello 123 456,就代表启动 hello程序,传递 123 456 到程序hello中,并且在程序hello把传递过来的参数打印出来。

(如果键盘输入"end"表示输入结束)

(1)、hello.c

#include <stdio.h>int main(int argc, char **argv)
{printf("%s\n", __FILE__);printf("进程ID:%d\n", getpid());for(int i=0; i<argc; i++){printf("argv[%d]:%s\n", i, argv[i]);}printf("Byebye!\n");    return 0;
}

(2)、exec_demo.c

#include<stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <string.h>int main(int argc , char **argv)
{printf("main id:%d\n",getpid());pid_t id = fork();if(id >0)         //父进程{printf("父进程 ID:%d\n",getpid());}else if(id ==0)  //子进程{//创建子进程之后,让子进程 执行新的目标程序printf("子进程 ID:%d \n",getpid());char input_str[10][256] = {0};  //char (*p)[256] = input_str;  --> char (*)[256]char *argv_buf[10] = {NULL};     //数组 ,每个元素存储的是 地址 char*// char*(*p)  = argv;  --> char **int cnt = 0;//1、用户输入 子进程要执行的新程序的名字  以及 要传递 新程序的参数printf("请输入子进程需要加载替换的程序名及参数(end结束):");  //hello  123  456  789  endwhile(1){scanf("%s",input_str[cnt]);//如果输入 end ,则退出if(0 == strcmp(input_str[cnt],"end")){break;}//argv[0] ---》char * 存储字符串argv_buf[cnt] = input_str[cnt];cnt++;}char file_name[1024] = {0};sprintf(file_name,"%s%s","./",input_str[0]);//2、调用exec函数簇 执行 新的程序 //execv(const char *path, char**argv);if(execv(file_name, argv_buf) == -1)  //char (*)[256]{perror("execv error");}}wait(NULL);return 0;
}

 (3)、程序执行结果

相关文章:

Linux系统编程---exec簇:进程的加载与替换

1、exec簇基础 在Linux中&#xff0c;用于加载并执行指定程序的API有exec簇和system函数。 exec簇的进程替换不会创建一个新的进程&#xff0c;只是加载新的程序代码和数据&#xff0c;替换当前进程执行的程序代码。 system函数的进程替换是创建一个新的子进程&#xff0c;然后…...

C++ 之 【模拟实现 list(节点、迭代器、常见接口)】(将三个模板放在同一个命名空间就实现 list 啦)

1.前提准备 (1) list 的底层结构一般是带头双向循环链表 (1)为避免命名冲突&#xff0c;需要创建一个命名空间来存放模拟实现的 list (2)下面模拟实现list时&#xff0c;声明和定义不分离(具体原因后续讲解) 2.完整实现 2.1 链表节点 template<class T>//节点写成类模板…...

数字图像处理 -- 眼底图像血管分割方法

算法框架 基于深度学习的 U-Net 架构&#xff0c;结合注意力机制&#xff08;Attention Gate&#xff09;与多尺度特征提取&#xff0c;以提高细小血管的检测能力。整体流程如下&#xff1a; 输入图像预处理&#xff1a;提取绿色通道 & CLAHE 增强数据增强&#xff1a;旋…...

基于ffmpeg的音视频编码

1 音频编码 本质上是由pcm文件转到一个协议文件 比如说aac协议 1.1 音频基本知识回归 比特率 比特率是指单位时间内传输或处理的比特&#xff08;bit&#xff09;数量&#xff0c;通常用 bps&#xff08;bits per second&#xff0c;比特每秒&#xff09;来表示。它是衡量数…...

Android wifi开发调试总结

Android wifi开发调试简单总结 文章目录 Android wifi开发调试简单总结一、前言二、wifi demo开发1、开关和连接2、wifi开启主要流程3 、wifi主要广播4、相关日志5、demo示例 三、其他1、Wifi开发小结2、其他wifi知识小结&#xff08;1&#xff09;Android无线Wifi开发&#xf…...

LLVIP、KAIST、M3FD数据集

LLVIP、KAIST、M3FD数据集 &#xff08;可见光红外&#xff0c;双模态数据集&#xff0c;已配准已对齐已清洗&#xff0c;已处理为txt格式&#xff0c;YOLO可直接训练&#xff09; 电子产品&#xff0c;一经出售&#xff0c;概不退换 算法设计、毕业设计、期刊专利&#xff01;…...

datasets 数据处理封装后,统一处理流程以避免Dataset Map顺序依赖问题

文章目录 处理流程说明小结 在实际项目中&#xff0c;我们常常需要对数据集进行预处理。为了规范操作&#xff0c;我封装了一个基础数据集处理类&#xff1a; class DatasetAbstract:"""所有数据集都应包含以下几个字段&#xff1a;* question&#xff1a;用户…...

【学习笔记】机器学习(Machine Learning) | 第四章(3)| 多变量线性回归

机器学习&#xff08;Machine Learning&#xff09; 简要声明 基于吴恩达教授(Andrew Ng)课程视频 BiliBili课程资源 文章目录 机器学习&#xff08;Machine Learning&#xff09;简要声明 三、特征工程与多项式回归&#xff08;一&#xff09;特征工程&#xff1a;从数据中发…...

将本地Springboot项目部署到Linux服务器

1、打包后端项目 在IDEA的终端上执行命令 mvn clean package "-Dmaven.test.skiptrue" 在target目录下查看jar包是否存在 2、idea运行jar包&#xff08;可选&#xff09; 在IDEA的终端上执行命令 # 进入jar包所在目录 E:\LzpWorkspaces\lzp-records> cd .\tar…...

无人设备遥控器之实时数据保护技术篇

无人设备遥控器的实时数据保护技术是保障设备安全运行、避免信息泄露或恶意干扰的核心手段&#xff0c;其核心目标是在复杂电磁环境和网络攻击威胁下&#xff0c;确保指令传输的完整性、保密性和抗干扰性。 一、技术实现路径 链路层加密与认证 动态密钥协商&#xff1a;采用…...

【优秀三方库研读】【性能优化点滴】odygrd/quill 解决伪共享

一、伪共享&#xff08;False Sharing&#xff09;问题本质 当不同CPU核心频繁修改**同一缓存行&#xff08;Cache Line&#xff09;**中的不同变量时&#xff0c;会导致严重的性能下降。现代CPU的缓存系统以缓存行&#xff08;通常64字节&#xff09;为单位操作内存&#xff…...

JavaScript性能优化实战(6):网络请求与资源加载优化

引言 在现代Web应用开发中,网络性能已成为影响用户体验的关键因素。据统计,用户等待页面加载的耐心通常不超过3秒,超过这个时间,约40%的用户会选择离开。此外,Google的研究表明,页面加载时间每增加0.5秒,流量就会下降约20%。因此,优化网络请求和资源加载不仅关乎用户体…...

re题(49)BUUCTF-crackMe

BUUCTF在线评测 int wmain() {FILE *v0; // eaxFILE *v1; // eaxchar v3; // [esp3h] [ebp-405h]char v4[256]; // [esp4h] [ebp-404h] BYREFchar Format[256]; // [esp104h] [ebp-304h] BYREFchar v6[256]; // [esp204h] [ebp-204h] BYREFchar v7[256]; // [esp304h] [ebp-10…...

Python中的单例模式:深入探索元类与装饰器实现

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 单例模式(Singleton Pattern)是设计模式中的一种重要模式,确保一个类在整个应用中只有一个实例,并且提供全局访问点。Python语言作为一…...

深入解析 Babylon.js 中的 TransformNode.lookAt 方法

在 3D 开发中&#xff0c;控制对象朝向是一个基础但关键的需求。Babylon.js 作为一款强大的 Web3D 引擎&#xff0c;提供了 TransformNode.lookAt 方法来实现这一功能。本文将全面解析这个方法的使用技巧、参数含义以及常见应用场景。 方法基础 TransformNode.lookAt 的基本签…...

SpringCloud组件——Gateway

一.网关 1.问题提出 我们通过Eureka&#xff0c;Nacos解决了服务注册&#xff0c;服务发现的问题&#xff0c;使用SpringCloud LoadBalance解决了负载均衡的问题&#xff0c;使用OpenFeign解决了远程调用的问题。 但是当前所有微服务的接口都是直接对外暴露的&#xff0c;可…...

Boost 库安装 (windows 11)

Boost 库安装 (windows 11 1 下载2 生成3 使用 1 下载 下载地址&#xff1a;https://www.boost.org/ 有的时候会需要历史版本下载&#xff1a; https://www.boost.org/users/history/ 2 生成 1、解压后点击 bootstrap.bat&#xff0c;会生成可执行程序b2.exe 2、双击运行b2.…...

lmms-eval--微调实战笔记

lmms-eval--大模型调用平台&#xff0c;方便新手上手大模型微调 lmms-eval的更多用法,没有mathversehttps://github.com/EleutherAI/lm-evaluation-harness.git 单卡运行&#xff0c;模型gpt-j-6B&#xff0c;数据集hellaswag git clone --depth 1 https://github.com/Eleuthe…...

序列密码算法ShanLooog512设计原理详解

序列密码算法ShanLooog512设计原理详解 ShanLooog512(闪龙512)为序列密码算法&#xff0c;内部状态为512比特&#xff0c;密钥长度为128或256比特&#xff0c;轮函数为FFFFFFFF&#xff0c;循环轮数为24轮&#xff0c;输出密钥流为512比特的状态。与Salsa20类似&#xff0c;内…...

Matplotlib可视化基础

1. 折线图 matplotlib.pyplot.plot() # 主要参数&#xff1a; x,y -- 接收array&#xff0c;表示X轴和Y轴对应的数据&#xff0c;无默认 color -- 接收特定string&#xff0c;指定线条的颜色&#xff0c;默认为None linestyle -- 接收特定string&#xff0c;指定线条的类型…...

Linux 内核网络协议栈中的关键数据结构:inet_skb_parm 与 ip_options

在 Linux 内核的网络协议栈中,数据包的高效处理依赖于一系列精心设计的数据结构。这些结构体不仅需要存储网络数据的元信息,还需支持复杂的协议逻辑(如路由、分片、安全策略等)。本文聚焦两个核心结构体 struct inet_skb_parm 和 struct ip_options,解析它们的设计原理、功…...

oracle 数据库查询指定用户下每个表占用空间的大小,倒序显示

oracle 查询指定用户下每个表占用空间的大小&#xff0c;倒序显示 使用场景&#xff1a;数据分析&#xff1b;导出医院正式库到开发环境时&#xff0c;查询出占用表空间高的业务表、导出时排除该表 在Oracle数据库中&#xff0c;要查询指定用户下每个表占用空间的大小并以倒序…...

Missashe考研日记-day29

Missashe考研日记-day29 1 专业课408 学习时间&#xff1a;3h学习内容&#xff1a; 今天先是把虚拟存储剩余的课听完了&#xff0c;然后就是做课后选择题&#xff0c;57道&#xff0c;已经接受了OS课后题尤其多的事实了。解决并且理解完习题之后就开始预习文件管理的内容&…...

【AI】【MCP】搭建私人王炸MCP自动化工作流

目录 一、什么是MCP 二、MCP大集合 三、准备工作 3.1 安装node.js 3.2 安装vscode 3.3 安装cline插件 3.3.1 安装 3.3.2 配置Cline 四、配置MCP服务 4.1 Search-mcp服务 4.2 playwright-mcp 服务 前言&#xff1a;梦想组合&#xff0c;轻松办公&#xff0c;告别手动&a…...

多元函数微分之传统方法和全微分法

一、传统方法 使用链式法则&#xff0c;先对中间变量&#xff08;如 u,v&#xff09;求偏导&#xff0c;再乘以中间变量对最终变量&#xff08;如 x,y&#xff09;的偏导。 二、全微分法 基于全微分形式不变性&#xff0c;直接对 zf(u,v) 求全微分 dz&#xff0c;再代入 du 和…...

新手SEO基础优化全解析

内容概要 对于刚接触SEO的新手而言&#xff0c;系统化理解优化逻辑是避免无效操作的关键。本文将从基础概念入手&#xff0c;逐步拆解搜索引擎排名的影响要素&#xff0c;围绕关键词分析、技术优化、内容策略三大核心模块&#xff0c;提供可落地的操作框架。通过结合工具使用说…...

MATLAB退火算法和遗传算法解决旅行商问题

模拟退火算法和遗传算法都是常用于解决旅行商问题&#xff08;TSP&#xff09;的优化算法&#xff0c;它们在原理、搜索方式、收敛速度和适用场景等方面存在一些区别&#xff1a; 原理 模拟退火算法&#xff1a;模拟退火算法的灵感来源于固体退火原理。固体在加热后缓慢冷却时…...

喜马拉雅卖身腾讯音乐:在线音频独立时代的终结

坦白说,这条消息一出来,喜马拉雅被卖掉不太奇怪,但是腾讯音乐会收购,还是有点意外。 喜马拉雅之前一度被称为中国版Audible平台,在过去几年里,活生生地把一手好牌打得稀烂。如今走到“卖身”这一步,既是无奈,也是必然。 简单回顾一下背景: 2012年,喜马拉雅成立,一…...

简单理解https与http

都是超文本传输协议&#xff0c;一个安全一个不安全&#xff0c;名字长的安全&#xff0c;名字短的不安全。 安全与不安全是居于什么分别的&#xff1f; 通过加密 http无加密。 httpshttp SSL/TSL&#xff08;加密&#xff09;来保障数据安全。加密传输 身份验证 SSL/TLS…...

打造即插即用的企业级云原生平台——KubeSphere 4.1 扩展组件在生产环境的价值全解

目录 打造即插即用的企业级云原生平台——KubeSphere 4.1 扩展组件在生产环境的价值全解 1. 可观测体系&#xff1a;WhizardTelemetry 全家桶 2. 平台与多集群治理 3. CI/CD 与交付效率 4. 网络与流量入口 5. 安全与合规 6. 存储与数据保护 7. 平台集成优势 结语 打造…...

配置扩展ACL

1.扩展ACL简介&#xff1a; 扩展ACL可以更精确地控制基于源IP地址、目标IP地址、协议类型和端口号的流量。 2.配置背景&#xff1a; 为了实现公司内部只能使用FTP服务器传输文件并关闭其他所有服务和端口的需求&#xff0c;可以通过配置访问控制列表&#xff08;ACL&#xf…...

根据用户出生日期计算年龄

public static int calculateAgeFromDate(Date birthDate) { // 将 Date 转换为 LocalDate&#xff08;默认时区&#xff09; LocalDate birthLocalDate birthDate.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); // 获取当前日期LocalDate currentDate Local…...

测试基础笔记第十五天

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、集合1.集合的定义二、使用集合列表去重 导包二、函数1.函数介绍2.定义函数3.调用函数4.函数实现登录案例5.函数的返回值 三、模块和包1.模块的概念(Module)2.模…...

【专题四】前缀和(3)

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…...

STM32 USB配置详解

STM32 USB配置详解 一、USB基础概念 1.1 USB简介 USB (Universal Serial Bus) 是一种用于计算机与外部设备连接的串行总线标准&#xff0c;具有热插拔、即插即用等特点。STM32微控制器内置了多种USB接口&#xff0c;可实现各类USB应用。 1.2 USB速度等级 Low Speed (LS): …...

2025年Mapbox零基础入门教程(1)地图初始化

什么是mapbox&#xff1f; mapbox是一个地图框架&#xff0c;不仅提供前端渲染能力&#xff0c;还具备后端服务接口能力。 相较于openlayers&#xff0c;它可构建二维和三维地图&#xff0c;并支持优化导航路线和位置查询等功能。 开发中使用mapbox需引入库文件并设置token&…...

课外知识:你需要了解的Python类对象里面的__getattr__方法

你需要了解的Python类对象中的__getattr__方法 一、__getattr__基础概念 1. 方法定义 def __getattr__(self, name: str) -> Any:"""当访问不存在的属性时触发"""2. 核心特性 动态属性处理&#xff1a;拦截未定义的属性访问按需触发&…...

openGauss新特性 | DataKit支持PostgreSQL到openGauss的迁移能力

Postgresql-\>openGauss迁移工具debezium-connector-postgres 可获得性 本特性自openGauss 7.0.0-RC1版本开始引入。 特性简介 debezium-connector-postgres工具是一个基于Java语言的Postgresql到openGauss的复制工具。该工具提供了初始全量数据及对象&#xff08;视图、…...

【前端】跟进新趋势- PWA WebAssembly

不定期更新及补充实战。建议关注收藏点赞。 目录 PWA&#xff08;渐进式 Web 应用&#xff0c;Progressive Web App&#xff09;WebAssembly&#xff08;WASM&#xff09; PWA&#xff08;渐进式 Web 应用&#xff0c;Progressive Web App&#xff09; PWA 是一种提升 Web 应用…...

C++学习:六个月从基础到就业——模板编程:SFINAE原则

C学习&#xff1a;六个月从基础到就业——模板编程&#xff1a;SFINAE原则 本文是我C学习之旅系列的第三十六篇技术文章&#xff0c;也是第二阶段"C进阶特性"的第十四篇&#xff0c;主要介绍C模板编程中的SFINAE原则。查看完整系列目录了解更多内容。 目录 C学习之…...

完美解决.NET Framework 4.0 中 System.Drawing 库不支持 WebP 格式的图像处理

如果你想在 .NET Framework 4.0 中使用 ImageMagick 处理图片&#xff0c;可以通过 Magick.NET 库来实现。Magick.NET 是 ImageMagick 的 .NET 封装&#xff0c;可以用来读取、写入、编辑图像。 以下是如何使用 Magick.NET 来处理图像并提取图像的宽度和高度。 步骤&#xff…...

网络基础概念:从菜鸟到入门

前言&#xff1a;快递小哥的故事 想象一下你要给朋友寄个礼物&#xff0c;这个过程其实和网络通信非常相似&#xff1a; 1. 你需要知道朋友的”地址“&#xff08;IP地址&#xff09; 2. 要注明是送到他家大门还是物业代收&#xff08;端口号&#xff09; 3. 要选择快递公司并…...

优先队列和单调队列(双端队列实现的)

这里写自定义目录标题 一、优先队列与单调队列二、优先队列2.1 概念2.2 增删查 判空2.3 示例代码 三、双端队列四、单调队列4.1 单调递增队列4.2 单调递减队列 一、优先队列与单调队列 二、优先队列 2.1 概念 一种特殊的队列&#xff0c;它与普通队列的主要区别在于元素的出…...

设计模式(状态模式)

概述 在实际的软件开发中&#xff0c;状态模式并不是很常用&#xff0c;但是在能够用到的场景里&#xff0c;它可以发挥很大的作用。从这一点上来看&#xff0c;它有点像我们之前讲到的组合模式。 状态模式一般用来实现状态机&#xff0c;而状态机常用在游戏、工作流引擎等系统…...

安卓基础(get和set)

在 Java 中&#xff0c;​​get 和 set​​ 方法是面向对象编程中 ​​封装&#xff08;Encapsulation&#xff09;​​ 的核心实现&#xff0c;用于安全地访问和修改类的私有字段&#xff08;private 成员变量&#xff09;。它们的核心作用是 ​​控制对数据的访问&#xff0c…...

机器人灵巧操作新突破,力感知技术让机械手更精准

在机器人的发展历程中&#xff0c;让机器人实现灵活操作一直是科研人员努力攻克的难题。 我们这篇文章给大家带来一份新的工作&#xff1a;DexForce 链接&#xff1a;[2501.10356] DexForce: Extracting Force-informed Actions from Kinesthetic Demonstrations for Dextero…...

八大排序——直接插入排序/希尔排序

八大排序——直接插入排序/希尔排序 目录 一、直接插入排序 二、希尔排序 一、直接插入排序 每一趟从待排序序列中取第一个值&#xff0c;将其插入到已排序好的序列中&#xff0c;对已排序好的序列&#xff0c;从右到左依次和待插入值比较&#xff0c;如果大于则向后挪&…...

8、HTTPD服务--ab压力测试

一、ab压力测试 # ab ‐c 100 ‐n 1000 http://vedio.linux.com/index.html 2 This is ApacheBench, Version 2.3 <$Revision: 1430300 $> 3 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ 4 Licensed to The Apache Software Foundation,…...

node.js 实战——mongoDB

MongoDB MongoDB 简介 MongoDB 是一种基于文档型 (document-oriented) 的 NoSQL 数据库&#xff0c;使用类 JSON 的 BSON 格式存储数据&#xff0c;自然支持复杂数据结构。它特别适合需要快速变化、大量数据处理和高应用扩展性的场景。 MongoDB 特性&#xff1a; 无法表、无…...

C语言学习路线

以下是一份综合多个优质资源的C语言学习路线规划&#xff0c;结合2025年最新技术趋势和工程实践需求&#xff0c;分为三个阶段系统推进&#xff1a; ​一、入门阶段&#xff08;1-2个月&#xff09;​​ ​目标​&#xff1a;掌握基础语法&#xff0c;能编写简单程序&#xff…...