Linux环境变量

  • Linux环境变量
  • github地址
  • 前言
  • 1. 基本概念
    • 环境变量的本质
  • 2. 认识常见的环境变量
    • PATH
      • 查看PATH
      • 修改PATH
    • HOME
    • SHELL
    • 其他常见环境变量
      • PWD与OLDPWD
      • LOGNAME与USER
      • SSH_TTY
    • 由环境变量理解权限
      • 使用系统调用获取环境变量
      • 理解权限
  • 3. 总结什么是环境变量
  • 3. 命令行参数和环境变量的全局性
    • 命令行参数
    • main函数的第三个参数
    • 环境变量具有全局属性
  • 4. 环境变量可以被子进程继承
  • 5. 本地变量与内建命令
    • 本地变量
      • 本地变量不能被子进程继承
    • 内建命令
      • 结合系统调用体会内建命令cd
  • 6. 结语

Linux环境变量

github地址

有梦想的电信狗

前言

​ 环境变量是操作系统为我们维护的一组 key=value 格式的键值对,它们像“隐形助手”一样,悄悄地决定了程序的运行行为、指令的查找路径以及用户的工作环境

​ 你是否好奇为什么在终端中输入 ls 就能列出文件,而运行自己写的程序却要加上 ./?你是否遇到过不同用户登录后,默认目录和权限有所不同?这一切的背后,其实都离不开环境变量的支持。

​ 本文将带你深入理解环境变量的本质、常见环境变量的作用、如何查看与修改环境变量,以及它们与命令行参数、本地变量、内建命令之间的联系。通过丰富的动图演示和详尽的代码解析,让你从操作层面到系统原理都能全面掌握 Linux 环境变量的精髓。

1. 基本概念

​ 在 Linux 操作系统原理中,环境变量(Environment Variables) 是一类在 操作系统层面定义的全局变量,用于配置操作系统行为和影响进程运行环境。它们通常以 键=值 的形式存在,作用范围可以是用户会话、进程,也可以被继承到子进程。

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
  • 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找
  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

环境变量的本质

  • 本质上是 以字符串形式存储在内存中的一组键值对
  • 每个运行中的进程都维护着一份自己的环境变量表,初始化来源是其父进程

2. 认识常见的环境变量

PATH

  • PATH:Linux系统的指令搜索路径
    • 为什么我们输入系统的指令(ls pwd)运行时不需要加./,而运行我们自己写的程序运行时需要加./

在这里插入图片描述

系统当中,针对于指令的搜索,Linux系统会为我们提供一个环境变量PATH

  • 环境变量PATH是系统开机就已经在shell中存在的

查看PATH

查看PATH的内容:

我们查看环境变量,需要借助echo指令。

  • echo PATH:直接输出PATHPATH默认会被当成字符串处理
  • 查看PATH中的内容需要使用$echo $PATH

查看任何环境变量的值都需要在环境变量名前加上$,一般使用命令echo $envName

# 查看环境变量的内容
echo $PATH   # $表示取环境变量的内容

在这里插入图片描述

修改PATH

PATH的内容是一系列路径,路径与路径之前用:分隔

在这里插入图片描述

  • 输入lsshell会在这些被冒号分隔开的路径中依次查找ls程序
    • 找到的话,执行。因为ls处于路径/usr/bin路径下,路径/usr/bin位于环境变量PATH中,所以系统可以找到直接执行
  • 输入我们自己的程序mycmd,该程序不在PATH中包含的各个路径下,mycmd程序所处的路径也不在环境变量PATH中,因此找不到,最终提示command not found。这个查找工作一般都是shell来完成的

那么这就意味着,我们自己编写的程序,想要像指令一样不加路径直接运行,有两种方法

  1. 将我们的自己的程序放入PATH中存在的路径中
    • 以程序mycmd为例,只需要将其移动到环境变量PATH中的目录即可
    • 使用mv mycmd /usr/bin命令,常见系统的指令通常位于/usr/bin目录下
  2. 将我们自己的程序所处的路径加入到PATH环境变量中

接下来我们演示第二种方法,并演示PATH的修改

在这里插入图片描述

  • 环境变量PATH访问和修改方法
# 查看环境变量的内容
echo $PATH   # $表示取环境变量的内容
# 修改
PATH=$PATH:newContent
# PATH=newPath   # 错误行为 会把PATH中之前的内容覆盖掉

修改环境变量使用等号=,这里的等号可以类比为赋值,赋值会把PATH中之前的内容覆盖掉。我们需要将指定的路径追加到PATH,因此指令为:PATH=$PATH:newPath,这里的行为依然是覆盖,但是$PATH保证了我们取出了PATH中已有的内容,并在后面加上:newPATH,保证了修改是追加新路径

  • 通过这种方式修改的PATH是一种内存级别的PATH,在shell中保存
  • 如果我们错误的修改了PATH,只需关闭XShell后重新登陆shell
  • shell没有启动时,PATH在系统的配置文件中保存。shell启动时,环境变量从系统的配置文件中加载到内存
    • which指令搜索时,也是在环境变量PATH中搜索的

HOME

  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
    • 为什么我们在首次登录Linux时,默认所处的目录是自己的家目录呢?
    • 为什么默认所处的路径/home/userName

在这里插入图片描述

​ 原因是,当我们登录时,shell会识别当前登录的用户名,给当前用户填充$HOME环境变量,填充的值为/home/用户名

当我们使用Xshell远程登录Linux时,xshell会为我们分配命令行解释器,命令行解释器会执行类似cd $HOME的命令,因此初次登录时,处于当前用户的家目录

SHELL

  • SHELL当前终端使用的Shell程序,它的值通常是/bin/bash
    • 如何查看当前系统中使用的是哪一个shell呢?
    • 只需要查看环境变量SHELL中的值,命令为:echo $SHELL
# 查看当前系统中正在使用的shell
echo $SHELL

在这里插入图片描述

  • 经验证,默认使用的shell一般是/bin/bash

其他常见环境变量

​ 除了以上环境变量,系统中还有很多其他的环境变量。

环境变量如此多,我们进行查看呢?我们可以使用env命令

  • env查看到当前的进程和bash进程从系统中继承下来的所有环境变量

在这里插入图片描述

PWD与OLDPWD

图中的标记对一些常见的环境变量进行了解释,还有一些不同的Linux发行版会显示的其他环境变量

  • 环境变量PWD:记录当前进程所处的工作路径

  • 环境变量OLDPWD:会记录当前进程所处的工作路径的上个路径

    • 我们的cd - 命令会被解析为cd $OLDPWD,因此可以跳转到上次所处的路径中

LOGNAME与USER

在这里插入图片描述

  • 可以看到,当我们在不同用户之间切换时,env获取到的环境变量值中的LOGNAME与USER也都在同步变化。
  • 在这里插入图片描述

SSH_TTY

这里对环境便令SSH_TTY简单提一下。SSH_TTY表示当前终端所使用的字符设备文件。当前SSH_TTY的值为/dev/pts/0

  • 我们再开启一个终端,向该文件中追加内容时,另一个终端中便会显示我们追加的内容,如下所示
    在这里插入图片描述

由环境变量理解权限

使用系统调用获取环境变量

在这里插入图片描述

​ 我们可以通过系统调用接口getenv()来获取环境变量,需要给该函数传入字符串格式的环境变量名该函数返回环境变量值,格式为char*风格的字符串,如下所示

在这里插入图片描述

理解权限

  • 我们Linux的权限理解部分,同一个文件,不同的用户在使用时,拥有不同的操作权限

    • 那么系统想要给我们限制权限,首先要获取到我们是谁。
    • 操作系统可以通过系统调用来获取当前用户是谁
  •   #include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>// 环境变量,可以让程序获取到当前系统中的用户是谁int main() {char who[32];strcpy(who, getenv("USER"));if (strcmp(who, "root") == 0) {printf("你是root用户, 可以做任何事情\n");} else {printf("你是普通用户, 受到权限约束\n");}return 0;}
    
  • 不同的用户执行相同的代码时,环境变量获取到的值就不一样,因此可以操作系统可以辨识出当前使用用户的身份

在这里插入图片描述

  • 有了环境变量,程序内部便可以获取环境变量,从而获知当前是哪个用户正在执行指令的

有了环境变量的存在,系统就有了获知当前是哪个用户正在执行指令的能力,获取后就可以将文件属性中的拥有者、所属组和文件所对应的权限进行比对,进而判定当前用户有无特定的权限


3. 总结什么是环境变量

经过以上对环境变量的熟悉和使用,我们可以得出环境变量的最终概念

环境变量是操作系统提供的一组name=value形式的变量,不同的环境变量有不同的用途通常具有全局属性

环境变量的本质

  • 本质上是 以字符串形式存储在内存中的一组键值对
  • 每个运行中的进程都维护着一份自己的环境变量表,初始化来源是其父进程。
功能示例变量说明
系统路径PATH指定可执行程序查找路径
当前用户信息USER, HOME当前登录用户和主目录
默认语言LANG控制系统语言和字符集
编辑器EDITOR系统默认文本编辑器
库路径LD_LIBRARY_PATH指定动态库搜索路径
shell 类型SHELL当前 shell 程序路径

3. 命令行参数和环境变量的全局性

命令行参数

什么是命令行参数?

  • 命令行参数:是指在命令行界面运行程序时,跟随在程序名称后的额外输出参数,用于控制程序的运行或传递数据

我们C/C++main函数是可以有参数的

int main(int argc, char* argv[]) {return 0;
}
  • 其中:
    • argc是一个整数,argv是一个字符串数组(指针数组)
    • argv字符串数组的大小由argc决定

main函数也是函数,因此main函数可以调用其他函数,同时也可以被其他函数调用C/C++程序运行起来时,int argcchar* argv[]这两个参数会被调用方进行传参。

  • 用户层面上main函数是被第一个调用的函数

  • 系统层面上:第一个调用的函数是Startup()函数或CRTStartup()函数,该函数会调用main函数,给main函数传参

使用以下代码查看char* argv[]中的内容:

int main(int argc, char* argv[]) {int i = 0;for (; i < argc; ++i) {printf("argv[%d]->%s\n", i, argv[i]);}return 0;
}

在这里插入图片描述

可以看到char* argv中的内容,就是我们输入的指令和附带的选项

  • argv[0]./mycmd
  • argv[i]后面附带的不同选项

为什么会这样呢?

这是因为,我们在**bash中输入的指令,本质上都是字符串,bash会把他们以空格为分隔符,分割成子字符串,分割成多少个字符串,就初始化argc为多少**

打散后 , argv指针数组中,每个空间,存放的都是相应字符串的地址。最后一个空间存放的是空指针NULL

在这里插入图片描述

  • 在系统层面上,被打散的字符串的地址存入char* argv[]中并初始化argcshell命令行解释器,会把这两个参数传递给程序的main函数。

  • 既然char* argv[]的最后一个位置的值为NULL,那么我们遍历argv[]就有了新的方式:

    • for循环的第二个位置表示循环终止条件,当argv[i]的值为NULL时,循环结束,也就完成了对argv[]的遍历

    •   int main(int argc, char* argv[]) {int i = 0;for (; argv[i]; ++i) {printf("argv[%d]->%s\n", i, argv[i]);}return 0;}
      
  • 在这里插入图片描述

以上就是命令行参数。以空格为分隔符。将输入的指令分割的过程,就叫做命令行解析

为什么要有main函数要有命令行参数?

  • 我们Linux中的指令都是C语言写的
    • main函数的命令行参数为指令、工具、软件提供命令行选项的支持
    • 调用同一个程序时,使用不同的选项,可以完成不同的功能

main函数的第三个参数

main函数不只有argc和argv两个参数,还可以带第三个参数,如下:

int main(int argc, char* argv[], char* env[]) {return 0;
}
  • 这里的第三个参数char* env[]表示的是从父进程继承过来的环境变量,其内容和env命令输出的内容一模一样

    • 使用以下代码验证

    •   // C/C++ 程序 两张表  main函数的第三个参数// 1. 命令行参数 向量表  2. 环境变量 向量表   这两张表的结构一模一样int main(int argc, char* argv[], char* env[]) {int i = 0;// argv 和 env 的最后一个元素存储的是NULL,遍历到结尾时,条件自动为假,所以退出循环for (; env[i]; ++i) {printf("env[%d]->%s\n", i, env[i]);}return 0;}
      

在这里插入图片描述

  • 综上:通过参数和char* env[]查看的环境变量和env命令查看到的环境变量一模一样
    • char* argv[]char* env[]的结构一模一样,且最后一个元素都是NULL指针
  • 不能简单的认为程序启动时,就是简单的将程序加载到内存。

而是程序在启动时,Startup函数会调用main函数,给main函数传递参数,传递两张表。命令行参数表和环境变量表

环境变量具有全局属性

​ 我们在命令行下所运行的所有进程,都是bash的子进程。bash在启动的时候,会从操作系统的配置文件中读取环境变量信息。子进程会继承父进程交给我的环境变量。子进程可以通过main函数的第三个参数char* env[]访问环境变量。

  • 而子进程再创建子进程,环境变量表就被无穷尽的传递下去了,因此说,环境变量具有全局性

环境变量也是进程的数据,进程具有独立性,父子进程fork之后的代码共享,数据,读时共享,写时拷贝

  • 一个进程还没有创建子进程时,如果已经创建好了环境变量,再创建子进程,就会被子进程继承下去
  • 环境变量的继承有两种方式
    • main函数传参
    • 直接继承

4. 环境变量可以被子进程继承

如何验证环境变量可以被子进程继承呢?

我们可以在系统的环境变量中加入一个我们自己的环境变量

增加环境变量命令

export [name=value]

# env可以查看全部的环境变量
# echo $PATH 等可以查看特定环境变量的内容
# 那么如何增加环境变量# 增加该环境变量 MY_VALUE=123456
export MY_VALUE=123456
  • export增加环境变量后,env命令中就多了我们添加的环境变量

在这里插入图片描述

  • export增加环境变量后,我们运行的bash的子进程./mycmd中,获取到的环境变量也有我们新增加的环境变量

在这里插入图片描述

这是因为环境变量可以被子进程继承

  • 发源进程只有一个,是bash,因此**bash及其的所有子进程构成的进程树,拥有相同的环境变量**

如果今天我想让我的所有进程都遵守一套规则,我可以把这套规则放在bash的环境变量中,这样所有的子进程都会有相同的环境变量

系统中的权限,每条指令都应该遵守,这些功能的实现就和环境变量有关

取消环境变量

# 取消我们刚刚新增的环境变量 MY_VALUE
unset MY_VALUE

bash进程取消环境变量MY_VALUE后,之后的子进程就也没有相应的环境变量了,读者可以自行验证

  • 另外,编译器在编译时,会对main函数的命令行参数进行检查,会进行条件编译。如果main函数有参数,会传入相应个数的参数。没有参数,就不传入参数

5. 本地变量与内建命令

本地变量

与环境变量对应的还有本地变量。

什么是本地变量?本地变量就是我们直接在shell中定义的变量

# 直接在bash命令行中定义
a=1
b=2
c=3

本地变量只会在本bash内部有效,不会被子进程继承

set命令可以显示系统中所有的变量。包括环境变量和本地变量

在这里插入图片描述

本地变量不能被子进程继承

  • 我们用本地变量MYVAL来测试,以下程序查看MYVAL的值
int main(int argc, char* argv[], char* env[]) {printf("MYVAL: %s\n", getenv("MYVAL"))return 0;
}

在这里插入图片描述

内建命令

  • 观察以下输出,思考问题

在这里插入图片描述

  • 前文提到,bash命令行中执行的程序,都是bash的子进程。
  • 前文提到,本地变量只在本bash内部有效,不会被子进程继承
  • 那么,echo $MY_val命令,echo也是Bash的子进程,./mycmd也是bash的子进程,无法获取到本地变量。echo也是bash的子进程,为什么能取到本地变量的?

我们纠正之前的结论命令行中所启动的指令,不一定全都要创建子进程

我们的命令要被分成两类

  • 常规命令:执行时,bash通过创建子进程执行
  • 内建命令:执行时,bash不创建子进程,而是bash自己亲自执行的。类似于bash调用了自己写的或者系统提供的函数。已知常见的内建命令如下:
    • echoecho是由bash执行的,bash内部有一个函数叫echoecho $MY_val时,echo获取到bash内部的本地变量输出出来就行了
    • cd:每个进程都有自己的当前工作目录,如果cd命令在执行时创建子进程,那么cd改变的将是子进程的工作目录,而不会改变主进程的工作目录

结合系统调用体会内建命令cd

在这里插入图片描述

​ bash也是一个程序,其内部在实现时,读取到用户输入cd时,bash并不会创建子进程,而是直接调用系统调用chdir改变bash程序当前的路径。

我们可以用如下代码进行验证:

由于我们执行mycmd时,bash会创建子进程,因此我们无法直接观察到bash的工作路径改变,我们可以观察/proc目录下进程的cwd目录

// 验证 cd 命令
int main(int argc, char* argv[]) {printf("before change:\n");sleep(40);if (argc == 2) {chdir(argv[1]);}printf("change end:\n");sleep(20);return 0;
}
  • sleep()是为了给我们输入指令查看进程的cwd留出时间

在这里插入图片描述

通过C语言提供的外部变量获取环境变量

在这里插入图片描述

// 通过C语言提供的 外部变量 environ 获取环境变量
int main() {int i = 0;extern char** environ;for (; environ[i]; ++i) {printf("%s\n", environ[i]);}return 0;
}

在这里插入图片描述

在这里插入图片描述


6. 结语

​ 至此,我们已经系统地学习了 Linux 环境变量的方方面面:它们的结构、用途、修改方式、继承机制,以及它们在程序启动和系统权限管理中的关键角色。从 PATHHOME从命令行参数到环境变量表,从本地变量的局部性到子进程的继承性,环境变量贯穿了整个 Linux 系统的运行脉络

​ 希望这篇文章不仅帮助你掌握了环境变量的使用技巧,更让你对 Linux 操作系统背后的逻辑有了更深的理解。


以上就是本文的所有内容了,如果觉得文章对你有帮助,欢迎 点赞⭐收藏 支持!如有疑问或建议,请在评论区留言交流,我们一起进步

分享到此结束啦
一键三连,好运连连!

你的每一次互动,都是对作者最大的鼓励!


征程尚未结束,让我们在广阔的世界里继续前行! 🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/91565.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91565.shtml
英文地址,请注明出处:http://en.pswp.cn/web/91565.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leecode-15 三数之和

我的解法&#xff08;不是完全解309/314&#xff09;我的思路是定义一个left和一个right&#xff0c;然后在向集合里去查询&#xff0c;看看有没有除了nums[left]&#xff0c;和nums[right]的第三个元素&#xff0c;把这个问题转换为一个遍历查找问题 利用List.contains()方法来…

精通分类:解析Scikit-learn中的KNN、朴素贝叶斯与决策树(含随机森林)

在机器学习领域&#xff0c;分类任务占据核心地位。Scikit-learn作为Python的机器学习利器&#xff0c;提供了丰富高效的分类算法。现在进行初步探讨三种经典算法&#xff1a;K最近邻&#xff08;KNN&#xff09;、朴素贝叶斯&#xff08;Naive Bayes&#xff09;和决策树&…

Galaxea机器人由星海图人工智能科技有限公司研发的高性能仿人形机器人

Galaxea机器人是由星海图人工智能科技有限公司研发的高性能仿人形机器人&#xff0c;具有多种型号&#xff0c;包括Galaxea R1和Galaxea R1 Pro。以下是关于Galaxea机器人的详细介绍&#xff1a; GitHub官网 产品特点 高自由度设计&#xff1a;Galaxea R1是一款全尺寸仿人型机…

python基础:用户输入和 while 循环

一、input() 函数的工作原理input() 函数让程序暂停运行&#xff0c;等待用户输入一些文本。获取用户输入后&#xff0c;Python 将其赋给一个变量&#xff0c;以便使用。message input("Tell me something, and I will repeat it back to you: ") print(message) 结…

开启云服务器mysql本地连接(is not allowed to connect to this mysql server)

is not allowed to connect tothis mmysql server 阿里云上安装的mysql&#xff0c;发现用本地电脑的navicat链接不上。通过了解知道了原因&#xff0c;小二在此写了一篇&#xff0c;省的以后自己在碰到。 错误如图。 aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTU4MTU1My8…

电脑的时间同步电池坏掉了,每次开机都要调整时间

电脑的时间同步的电池没电了&#xff0c;每天开机时间都不对&#xff0c;要打开时间同步按钮来设置时间解决方案1.找到这个设置并打开&#xff0c;实际上&#xff0c;要打开这个界面&#xff0c;时间才会同步&#xff0c;可能是我的电脑原因&#xff0c;所以我没办法打开这个就…

mycat在游戏中的使用场景(邮件表,mysql集群,而不是邮件服)

其实还有一种是SharingJDBC&#xff0c;而且之间在B站的同学也是说用这个&#xff0c;但是我们目前项目邮件中用的却是: mycat&#xff0c;为什么呢&#xff1f;mycat其实是中间件&#xff0c;是需要独立部署的&#xff0c;是数据库服务器这块的代理&#xff0c;在应用层的话很…

TP-Link Archer C50路由器曝安全漏洞,硬编码DES密钥可解密敏感配置

漏洞概述CERT协调中心&#xff08;CERT/CC&#xff09;发布安全公告&#xff0c;披露TP-Link Archer C50路由器存在编号为CVE-2025-6982的漏洞。该漏洞源于路由器固件中使用了硬编码的DES&#xff08;数据加密标准&#xff09;解密密钥&#xff0c;这一设计缺陷使大量家庭和小型…

番茄项目3:完成了项目的数据库设计

今天抽了会时间设计了下表结构&#xff0c;并选定的使用的数据库&#xff0c;经过调查&#xff0c;我决定还是把数据存在数据库中&#xff0c;因为写SQL是我擅长的。 最终我选择使用python自带的sqlite来实现这个工具&#xff0c;具体建表语句如下&#xff1a; 基于AI生成&…

11、read_object_model_3d 读取点云

个人理解 read_object_model_3d 这个Halcon算子中的xyz_map_width这个参数设置的目的就是,把读取的点云数据中每一个点的XYZ坐标,生成一个对应的二维图像,其中图像中的坐标值就对应每一个点的索引坐标,而图像中的灰度值就对应xyz坐标??(因为得到的是三通道图像)!!并且根…

【人工智能-17】机器学习:KNN算法、模型选择和调优、朴素贝叶斯分类

上一期【人工智能-16】机器学习&#xff1a;概念、工具介绍、数据集、特征工程 文章目录一 、KNN算法1. 应用理由2. 原理核心&#xff1a;距离度量 多数投票/平均3. 优点和缺点二、模型选择和调优1.使用理由2.原理核心&#xff1a;数据划分与性能平均3.超参数搜索4. 应用场景总…

关于继承的一些知识(C++)

当我们想要设计几个类分别记录老师&#xff0c;学生的个人信息时会发现&#xff0c;像姓名、地址、身份证号、电话等等记录基础信息的成员变量是都具有的&#xff0c;重复定义会显得冗余&#xff0c;但同时它们两者又具有不同的记录信息的成员变量&#xff0c;像学生需要记录学…

永磁同步电机无速度算法--脉振方波注入法

一、原理介绍为了实现表贴式永磁电机的低速运行&#xff0c;研究一种基于高频方波测试信号注入的无位置零低速传感器控制策略。选取注入到观测直轴的脉振高频方波信号&#xff0c; 该信号注入方案可以有效避免旋转信号注入法在转子交轴分量引起转矩脉动&#xff0c; 提高系统的…

VSCode Python 与 C++ 联合调试配置指南

VSCode Python 与 C 联合调试配置指南 为了实现 Python 与 C 的联合调试&#xff0c;需要正确配置 launch.json 文件&#xff0c;具体配置如下&#xff1a; {// IntelliSense 支持查看属性描述// 更多信息请参考: https://go.microsoft.com/fwlink/?linkid830387"version…

stm32和freeRtos的can总线

STM32内置bxCAN外设&#xff08;CAN控制器、拓展CAN&#xff09;&#xff0c;支持CAN2.0A和2.0B(全部的CAN)&#xff0c;可以自动发送CAN报文和按照过滤器自动接收指定CAN报文&#xff0c;程序只需处理报文数据而无需关注总线的电平细节波特率最高可达1兆位/秒&#xff0c;高速…

充电桩与照明“联动”创新:智慧灯杆破解新能源基建难题

伴随新能源汽车保有量呈现出极为迅猛的爆发式增长态势&#xff0c;充电基础设施的建设已然逐步成为城市发展进程中不可或缺的刚性需求。国家政策鼓励推进充电设施同城市基础设施展开一体化的建设工作&#xff0c;同时大力鼓励“诸如路灯、监控杆这类市政设施去整合充电相关功能…

datagrip连接mysql数据库过程以及遇到的问题

如果遇到这种错误说明时区错误&#xff0c;解决方法 jdbc:mysql://localhost:3306?serverTimezoneGMTdatagrip连接mysql数据库下一步

Vue 3.5 defineModel:让组件开发效率提升 10 倍

简介 defineModel 是 Vue 3.4 引入并在 Vue 3.5 中稳定的一个组合式 API&#xff0c;它简化了组件的双向数据绑定实现。在此之前&#xff0c;实现双向绑定需要手动定义 props 和 emits&#xff0c;而 defineModel 将这个过程自动化&#xff0c;让代码更加简洁和直观。 主要特…

性能测试-性能测试中的经典面试题一

一、核心概念与流程类性能测试的核心类型与区别负载测试&#xff1a;逐步加压&#xff0c;探测系统阈值&#xff08;如最大TPS/响应时间&#xff09;。压力测试&#xff1a;超越阈值施压&#xff0c;验证系统崩溃点及恢复能力。稳定性测试&#xff1a;80%~90%峰值压力持续运行&…

华为昇腾芯片:多模态模型国产化的硬核突破

前言 在当今数字化时代&#xff0c;人工智能技术的发展日新月异&#xff0c;多模态模型作为 AI 领域的重要发展方向&#xff0c;正逐渐改变着人们与计算机交互的方式以及众多行业的运作模式。多模态模型能够处理多种类型的数据&#xff0c;比如图像、文本、语音等&#xff0c;从…