libc中定義的全域性變數environ指向環境變數表,environ沒有包含在任何標頭檔案中,所以在使用時要用extern宣告。例如:
#include
int main(void)
由於父程序在呼叫fork建立子程序時會把自己的環境變數表也複製給子程序,所以a.out(編譯以上程式所生成的應用程式)列印的環境變數和shell程序的環境變數是相同的。
按照慣例,環境變數字串都是name=value這樣的形式,大多數name由大寫字母加下劃線組成,一般把name的部分叫做環境變數,value的部分則是環境變數的值。環境變數定義了程序的執行環境,一些比較重要的環境變數的含義如下:
path
* 可執行檔案的搜尋路徑。ls命令也是乙個程式,執行它不需要提供完整的路徑名/bin/ls,然而通常我們執行當前目錄下的程式a.out卻需要提供完整的路徑名./a.out,這是因為path環境變數的值裡面包含了ls命令所在的目錄/bin,卻不包含a.out所在的目錄。path環境變數的值可以包含多個目錄,用:號隔開。在shell中用echo命令可以檢視這個環境變數的值:
$ echo $path
shell
* 當前shell,它的值通常是/bin/bash。
term
* 當前終端型別,在圖形介面終端下它的值通常是xterm,終端型別決定了一些程式的輸出顯示方式,比如圖形介面終端可以顯示漢字,而字元終端一般不行。
lang
* 語言和locale,決定了字元編碼以及時間、貨幣等資訊的顯示格式。
home
* 當前使用者主目錄的路徑,很多程式需要在主目錄下儲存配置檔案,使得每個使用者在執行該程式時都有自己的一套配置。
用environ指標可以檢視所有環境變數字串,但是不夠方便,如果給出name要在環境變數表中查詢它對應的value,可以用getenv函式。
#include
char *getenv(const
char *name);
getenv的返回值是指向value的指標,若未找到則為null。
修改環境變數可以用以下函式
#include
int setenv(const
char *name, const
char *value, int rewrite);
void unsetenv(const
char *name);
putenv和setenv函式若成功則返回為0,若出錯則返回非0。
setenv將環境變數name的值設定為value。如果已存在環境變數name,那麼:
若rewrite非0,則覆蓋原來的定義;
若rewrite為0,則不覆蓋原來的定義,也不返回錯誤。
unsetenv刪除name的定義。即使name沒有定義也不返回錯誤。
例:修改環境變數
#include
#include
int main(void)
linux 程序與程序環境
程序與程序環境 程序是執行中的程式,每個程序都執行在各自的虛擬位址空間中,某個程序的崩潰不會影響其它程序的執行。程序間的通訊 ipc 要通過系統核心 系統呼叫 來實現。程序分類 在linux系統中,根據程序的特點,程序可分為3大類 互動程序 批處理程序和守護程序。l 互動程序 由shell啟動的程序...
Unix程序環境之3 程序環境列表
1 程序環境 簡介當乙個程序 proecss 呼叫另乙個程式 program 時,同時會傳遞這個程式執行的環境列表 environment list 程序環境列表是乙個字元指標陣列,每個字元指標是乙個以空字元 null terminated 結束的c 字串。字元指標陣列位址包含在全域性變數envir...
《unix高階環境程式設計》程序環境 程序終止
當核心執行c程式時 使用乙個exec函式執行 在呼叫mian函式前先呼叫乙個特殊的啟動例程。可執行程式檔案將此啟動例程指定為程式的起始位址。下面是c程式啟動和終止的流程,由圖中可以知道,程序的終止根據不同的函式呼叫是不一樣的,其中 exit和 exit函式是終止程序直接進入核心,exit函式則先執行...