各位看官們,大家好,上一回中咱們說的是exec系列函數的例子,這一回咱們說的例子是:查看環境變量。閒話休提,言歸正轉。讓我們一起talk C栗子吧!
看官們,我們在前面介紹exec系列函數時提到過程序的運行環境,有些看官可能不太明白,今天我們一起來看看程序運行環境中的環境變量。環境變量在實際編寫程序的時候經常使用,比如常用的PATH環境變量。有時候程序無法運行,就是環境變量錯誤引起的。
環境變量是操作系統提供的一種參數,程序可以通過這些參數來在操作系統中運行,它是本質上是鍵值對序列。
例如:SHELL=/bin/bash。
其中SHELL是環境變量的名稱,它的值是等於號後面的內容,它提示我們運行的shell程序是/bin/bash。我們可以把SHELL看作鍵,等號後面的內容看作是值。這就是它的本質:鍵值對。
我們可以在終端中通過命令來查看當前的環境變量,常用的命令有echo,set和env.
環境變量有很多,比如我們常用的SHELL,PATH,可以使用echo命令來查看單個環境變量的值,前提是
你需要知道環境變量的名字。
$ echo $SHELL //通過echo命令查看單個環境變量的值
/bin/bash
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
如果忘記環境變量的名字,也不要擔心,我們可以使用set命令查看當前終端中的環境變量。
$ set //運行set命令
BASH=/bin/bash
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/home/talk8
HOSTNAME=talk8-PC
HOSTTYPE=i686
LOGNAME=talk8
這裡只選擇了一些常見的環境變量,其它的環境變量就不一一列出了。
此外,env命令也可以查看環境變量,只是它比set命令查看的范圍更加大一些。它可以查看到當前系統中所有的環境變量。
$ env //運行env命令
LC_PAPER=zh_CN.UTF-8
TERM=xterm
SHELL=/bin/bash
USER=talk8
USERNAME=talk8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
LANG=zh_CN.UTF-8
HOME=/home/talk8
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
XDG_SESSION_DESKTOP=default
LOGNAME=talk8
系統的環境變量比較多,這裡只選擇了一些常見的環境變量,其它的環境變量就不一一列出了。
台下已經有不少看官在終端中試驗這些命令了,哈哈。不過大家不要忘記我們是talkC粟子呀,除了這些命令可以查看環境變量外,我們也可以在C程序中查看環境變量。
系統提供了getenv函數來查看環境變量,下面是該函數的原型:
char *getenv(const char *name);
函數只有一個參數,參數是字符指針,用來接收變量名; 函數返回與變量名匹配的值,如果變量名不存在或者變量沒有值,返回空指針;
下面是程序的核心代碼,請大家參考
char *env_key = "SHELL";
char *env_value = NULL;
env_value = getenv(env_key);
if(NULL != env_value)
printf("the value of %s is %s \n",env_key,env_value);
else
printf("there is not any value of %s \n",env_key);
在代碼中我們通過getenv函數獲取了環境變量SHELL的值,並且顯示到終端中,下面是程序的運行結果:
the value of SHELL is /bin/bash
大家可以看到,該結果和我們剛才使用echo命令得到的結果完全一致。
大家可能已經感覺到了,使用該函數需要提前知道環境變量名,這點和echo命令一樣,有沒有像set和env命令一樣查看所有環境變量的函數。答案是沒有。台下已經看官歎氣了,哈哈。看官別失望。沒有函數咱們可以自己寫一個呀,自己寫?怎麼寫?我給個提示:系統中所有的環境變量都存放在了一個叫environ的變量中,不過該變量是一個指向字符串的指針。它的定義如下:
char **environ;
現在大家明白如何了嗎?咱們比一比誰寫的快。下面是我寫的代碼:
extern char ** environ;
char ** env_array = NULL;
env_array = environ;
while(NULL != *env_array)
printf("%s \n",*env_array++);
關於代碼,我說幾個需要注意的地方:
我們在使用前需要先對environ變量進行聲明。 我們可以把該變量當作一個字符串數組,該數組的最後一個元素為空指針。 明白這些後,顯示環境變量就和遍歷數組一樣簡單。程序的運行結果,我就不列出了,相信大家已經自己完成了該程序。大家可以把該程序的運行結果和env命令的運行結果比較一下,你將會發現它們是完全相同的。
看官們,完整的代碼放到了我的資源中,大家可以下載使用。
最後,我們總結一下查看環境變量的方法:
使用Linux命令:echo,set和env. 使用函數:getenv。該函數得到結果和echo相同。 使用變量:environ。該變量得到的結果和env命令的結果相同。各位看官,關於查看環境變量的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。