【Linux我做主】細說環境變量

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;從…