4.環境變量

目錄

1.并行與并發

2. 環境變量

2.1 舉例子

2.2 命令行參數

2.3 環境變量


?

1.并行與并發

并行:多個進程在多個CPU下分別、同時運行,稱為并行

并發:多個進程在一個CPU下采用進程切換的方式,在一時間段內,多個進程同時推進,稱為并發

有這樣一個問題

int get_value() 
{int x = 42;  return x;    
}int main()
{int ret = get_value();cout << ret << endl;return 0;
}

為什么函數的返回值,會被外部拿到呢?

????????通過CPU寄存器,編譯器將return x轉化成了mov eax 10,eax是CPU中的寄存器,函數直接將x的值放入了寄存器,x自己銷毀并不影響這個寄存器,調用方仍可以拿到。

既然進程在一直切換,每個進程就執行時間片的時間,系統如何得知某個進程上次執行到哪行代碼了?

??????? 有一個程序計數器eip,存儲當前執行指令下一條指令的地址

CPU中有很多寄存器,扮演什么角色?

??????? 提高運行效率,進程的高頻數據放入寄存器中。因為進程相關的數據需要隨時被訪問或者修改,所以要放到CPU的寄存器中。

所以CPU寄存器中保存的是進程的臨時數據也就是進程的上下文。進程在從CPU上離開的時候,要將自己的上下文數據保存好,甚至帶走,這個保存的目的就是為了恢復。

進程在被切換的時候:保存上下文;進程回來運行時,恢復上下文。

上下文信息就當保存到進程的PCB中,PCB有一個寄存器結構體,專門存每個寄存器中的這些信息

2. 環境變量

直接講概念有些晦澀,先舉幾個環境變量出來認識一下。

2.1 舉例子

1. 我們想執行自己寫的程序就得指明路徑:./mycode,那系統怎么知道 ls、pwd 等指令執行時去哪里找呢?怎么知道這些指令程序在哪里呢?

??????? OS在執行命令時,shell會在PATH中的路徑下一個一個去找。

PATH:Linux系統的指令搜索路徑,以:進行分割

也可以添加其他目錄到PATH中,重登Xshell就重置了。

2. 當我們登入時,它怎么知道一上來就在家目錄下呢?而不是什么其他的目錄呢?

HOME:登入時會執行類似cd &HOME 這樣的命令,直接跳到家目錄下。

PWD:會記錄當前目錄的環境變量

有了環境變量的存在,我們的系統就具備了認識用戶是誰的能力,只要能認識用戶是誰,就能把文件擁有者和權限做對比,從而判斷出用戶有無讀寫權限

2.2 命令行參數

ls是命令,后面的-l就是命令行參數

對這個代碼進行下面這樣的調用產生了命令行參數類型的結果:

這個程序很好的模擬了命令行參數的實現過程,argv[0]就是命令本身,后面的可變參數列表存儲命令行參數。

我們輸入的其實是字符串,bash將其打散成 "./mycmd"、"-a"、"b"、"c"。

所以在真正執行main函數之前,操作系統已經干了很多事情了。

為什么要傳給main參數呢?為指令、工具、軟件等提供命令行選項的支持。

這個代碼更能詳細的說明命令行參數的作用

可以發現系統自己的命令其實就是類似這么實現的,異曲同工

我們可以發現,main函數也是函數,是操作系統來給它傳參,調用它。

2.3 環境變量

但main函數不只這兩個參數,還有第三個 env

env代表環境變量表,前面的argv代表命令行參數表

這個程序可以打印出所有環境變量:

我們所運行的進程,都是bash的子進程,bash本身在啟動的時候,會從操作系統的配置文件中讀取環境變量信息,子進程會繼承父進程交給它的環境變量,所以環境變量會被所有子進程繼承下去,環境變量具有全局屬性

怎么證明被繼承了?
我們自己搞一個環境變量,看看它會不會被繼承。

我們可以看到,在命令行中直接定義,在env中是找不到的,這時這個變量叫做本地變量,怎么變成環境變量呢?下一行:export,此時就可以找到我們自己定義的環境變量了。

./mycmd 也是能拿到這個環境變量的

本地變量只會在本bash內有效不會被繼承,而echo是沒有創建子進程的,所以echo是能打印這個本地變量的。?

這也說明了:命令不一定全都會創建子進程,很有把握的就直接操作了,不用擔心會影響bash。

所以命令有兩種:

  • 常規命令:通過創建子進程去完成的
  • 內建命令:bash不創建子進程,而是由自己親自執行,類似于bash調用了自己寫的、或者系統提供的函數(cd 也是典型的內建命令)

取消環境變量:

環境變量就是在操作系統中用來指定操作系統運行環境的一些參數

int main()
{printf("%S\n", getenv("PATH"));return 0;
}

這樣也是可以獲得環境變量的

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77597.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77597.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77597.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot 中使用 Feign 調用內網 IP 接口并記錄入參與出參

在微服務架構中&#xff0c;服務間的通信是常見的需求。Spring Cloud 提供的 Feign 客戶端是一個聲明式的 Web 服務客戶端&#xff0c;它使得服務間的調用變得非常簡單。然而&#xff0c;在實際開發中&#xff0c;我們可能需要調用內網 IP 地址的接口&#xff0c;并且希望記錄請…

【Java】 使用 HTTP 響應狀態碼定義web系統返回碼

系統狀態碼定義 public interface GlobalErrorCodeConstants {ErrorCode SUCCESS new ErrorCode(0, "成功");// 客戶端錯誤段 ErrorCode BAD_REQUEST new ErrorCode(400, "請求參數不正確");ErrorCode UNAUTHORIZED new ErrorCode(401, "賬號未登…

如何搭建spark yarn模式的集群

一、基礎環境準備 ?安裝JDK 1.8? 所有節點需安裝JDK并配置環境變量&#xff0c;確保JAVA_HOME正確指向安裝路徑14。?部署Hadoop集群? 安裝Hadoop&#xff08;推薦3.x版本&#xff09;&#xff0c;配置YARN資源管理器4。在yarn-site.xml中啟用資源調度&#xff1a; <pro…

python22-元組、列表、字典、集合推導式

課程&#xff1a;B站大學 記錄python學習&#xff0c;直到學會基本的爬蟲&#xff0c;使用python搭建接口自動化測試就算學會了&#xff0c;在進階webui自動化&#xff0c;app自動化 循環語句小作業 元組推導式列表推導式字典推導式實踐是檢驗真理的唯一標準 推導式 簡介 Pytho…

探索 CameraCtrl模型:視頻生成中的精確攝像機控制技術

在當今的視頻生成領域&#xff0c;精確控制攝像機軌跡一直是一個具有挑戰性的目標。許多現有的模型在處理攝像機姿態時往往忽略了精準控制的重要性&#xff0c;導致生成的視頻在攝像機運動方面不夠理想。為了解決這一問題&#xff0c;一種名為 CameraCtrl 的創新文本到視頻模型…

跨端開發技術總結

1.electron&#xff1a; 基于node.js 桌面端&#xff1a;window / linux / macos 手機端&#xff1a;無 頁面&#xff1a;網頁開發相關技術都可以 2.tauri 基于rust 桌面端&#xff1a;window / linux / macos 手機端&#xff1a;android / IOS 頁面&#xff1a;網頁開…

單片機-89C51部分:7、中斷

飛書文檔https://x509p6c8to.feishu.cn/wiki/A5gcwyL5giq1JOkkcsscn8eLnzf 一、中斷的作用 中斷是為使單片機具有對外部或內部隨機發生的事件實時處理而設置的&#xff0c;中斷功能的存在&#xff0c;很大程度上提高了單片機處理外部或內部事件的能力。它也是單片機最重要的功…

0805登錄_注冊_token_用戶信息_退出-網絡ajax請求2-react-仿低代碼平臺項目

文章目錄 1 JWT1.1 JWT結構1.2 工作流程1.3 優點1.4 缺點1.5 安全實踐1.6. 適用場景1.7 JWT與OAuth2**8. 示例代碼&#xff08;Node.js&#xff09;** 2 用戶mock和api3 注冊4 登錄5 token存儲6 請求攔截器設置token6 獲取用戶信息7 退出登錄結語 1 JWT JSON Web Token&#x…

大模型入門

一、模型入門路徑 1. 學習預備知識 編程語言&#xff1a;熟練掌握Python編程語言&#xff0c;包括基本語法、數據結構&#xff08;列表、字典、元組等&#xff09;、面向對象編程、文件操作等。Python有豐富的機器學習和深度學習庫&#xff0c;方便進行大模型的開發和實驗。數…

把dll模塊注入到游戲進程的方法_插APC注入

一、概述 APC是異步過程調用,系統創建線程的時候會為線程創建一個APC隊列,當線程調用SleepEx,WaitSingleObjectEx等函數時,并把線程狀態被設置為可提醒狀態時,線程并不會睡眠,而是檢查APC隊列是否為空,如果不為空,轉去執行APC隊列中的每一項,因此給目標進程中的線程插…

git 如何清空當前分支的歷史提交記錄,僅保留最后一次提交

本方法基于新建 Git 孤立分支實現&#xff1a; 1. ??首先檢出待清理的分支 在 IDEA 右下角檢查當前分支名稱 或執行 git branch 確認。如果不在目標分支上&#xff0c;會顯示 (HEAD detached at xxxxx)&#xff0c;這時需要先切換分支&#xff1a; git checkout 原分支名 2.…

【C++】Googletest應用

Googletest 1 配置 使用cmake配置&#xff1a; 具體文件后面上傳補充 ./test.out --gtest_filterXXXTest.xxx 2 gdb 為了跟蹤流程&#xff0c;可以使用gdb&#xff1b; gdb ./xxx.out gdb --args ./gtest --gtest_filterxxx.xxx設置運行參數 set args --gtest_filterxxx.…

JavaScript:從DOM概述到window對象的常見事件

一、BOM概述 1.BOM的概念 BOM&#xff08;Browser Object Model&#xff09;即瀏覽器對象模型&#xff0c;它提供了獨立于內容而與瀏覽器窗口進行交互的對象&#xff0c;其核心對象是window 2.BOM的構成 BOM比DOM更大&#xff0c;它包含DOM window對象是瀏覽器的頂級對象&a…

qobject與event事件應用

int main(int argc, char *argv[]) {QApplication a(argc, argv);MyWidget mainWidget;mainWidget.setWindowTitle("QObject與事件處理示例");mainWidget.resize(200, 200);mainWidget.show();return a.exec(); }QApplication a(argc, argv);&#xff1a;創建 QAppli…

QTableView復選框居中

目錄 方法一&#xff1a;QSS方法2:自定義復選框委托類一、構造函數 CheckBoxDelegate()二、paint() 方法三、editorEvent() 方法四、關鍵設計要點五、擴展應用場景六、代碼示例&#xff08;補充&#xff09; 方法一&#xff1a;QSS QTableView::indicator {position: relative…

基于QT的仿QQ音樂播放器

一、項目介紹 該項目是基于QT開發的?樂播放軟件&#xff0c;界面友好&#xff0c;功能豐富&#xff0c;主要功能如下&#xff1a; 窗口hand部分&#xff1a; 點擊最小化按鈕&#xff0c;窗口最小化 點擊最大化按鈕&#xff0c;窗口最大化 點擊關閉按鈕&#xff0c;程序退出 …

SQL知識點合集---第二彈

數據一 <select id"listPositionAuditCheckSample" resultType"net.nxe.cloud.content.server.entity.PositionAuditCheckSample"><trim prefixOverrides"union all"><if test"userSampleCount ! null and userSampleCount…

【QT】QT控制硬件

QT控制硬件 1.上位機程序開發2.具體例子控制led燈3. linux中的函數跟QT類里面的函數同名&#xff0c;發生沖突4.示例代碼 1.上位機程序開發 QT做一個上位機程序&#xff0c;控制底層的硬件設備(下位機) 總結&#xff1a; 在構造函數里面去初始化&#xff0c;打開硬件驅動在析…

Flutter介紹、Flutter Windows Android 環境搭建 真機調試

目錄 Flutter介紹 Windows 環境搭建 1.安裝配置JDK 2.下載安裝Android Studio 3.下載配置Flutter SDK ?4.運行Flutter doctor命令檢測環境是否配置成功 ?5.打開Android Studio安裝Flutter/Dart 插件 ?6.插件運行Flutter項目 ?編輯 Flutter Android真機調試 Flut…

Android Studio 中使用 SQLite 數據庫開發完整指南(Kotlin版本)

文章目錄 1. 項目準備1.1 創建新項目1.2 添加必要依賴 2. 數據庫設計3. 實現數據庫3.1 創建實體類 (Entity)3.2 創建數據訪問對象 (DAO)3.3 創建數據庫類 4. 創建 Repository5. 創建 ViewModel6. 實現 UI 層6.1 創建筆記列表 Activityactivity_notes_list.xmlNotesListActivity…