環境變數和地址空間

ruo_bing發表於2018-08-24

環境變數

linux系統中的環境變數是用來指定系統執行的環境的一些引數,例如編寫程式碼時,連結時的動態靜態庫,我們並不知道在哪裡,但照樣可以連結成功,簡單來說,就是通過環境變數幫助編譯器進行查詢。

檢視環境變數

echo $環境變數名稱

常見的幾個環境變數

  1. PATH:系統提供搜尋路徑的環境變數
  2. HOME: 簡單來說就是使用者登入到linux系統中時,預設的目錄
  3. HISTSIZE:儲存歷史命令記錄的條數(例如,翻動上鍵時可以找到上一次的命令,此次算一條)
  4. SHELL:當前SHELL,值通常為/bin/bash

環境標量相關的指令

  1. env :顯示所有的環境變數
  2. echo:顯示某個環境標量
  3. export:設定一個新的環境變數
  4. unset: 清除環境變數
  5. set: 顯示本地定義的環境變數

環境變數也是一種變數,這種變數具有全域性屬性

獲取環境變數的方法

1. 通過程式碼獲取,用main函式的引數來獲取

#include<stdio.h>
     int  main(int argc,char *argv[],char *env[])  //第一個參數列示引數的個數,第二個是具體的引數,第三個是環境變數
     {
         int i = 0;
         for(; env[i];i ++i)
         {
             printf("%s\n",env[i]);
         }
         retrun 0;
     }

2.通過第三方變數enviro獲取

#include<stdio.h>
int main()
{

3.用getenv函式來訪問特定的的環境變數

printf("%s\n",getenv());

地址空間

記憶體地址就是對一個記憶體的一個編號,一個地址指向的就是記憶體的某個位置

在實際操作中我們發現,用fork建立的子程式和父程式輸出的地址一模一樣,但內容變數是不一樣的,在實際中,兩個程式的實體地址是不可能一樣的,由此可以得出結論:我們用c/c++語言所看到的地址都是——虛擬地址,子程式和父程式輸出的變數不是同一個變數

建立一個程式的底層實現,如下圖
這裡寫圖片描述

建立一個程式總結:

  1. 先為程式建立一個PCB;
  2. 每一個PCB都指向一個虛擬地址(mm_struct);
  3. 系統在分配一個頁表將虛擬地址對映到實體記憶體當中;(如上圖所指,所以父程式和子程式的地址相同,即虛擬地址相同,內容不同,其實是被對映到了不同的物理空間)

相關文章