lienhua34
2014-10-03linux
在每一個進程啓動時,都會接到一張環境表。環境表是一個字符指針數組,其中每一個指針包含一個以 null 結束的 C 字符串的地址。全局變量environ 則包含了該指針數組的地址,數組
extern char **environ;函數
例如,圖 1 顯示了包含有 5 個環境字符串的環境表,spa
圖 1: 含有 5 個環境字符串的環境表3d
環境字符串的形式一般爲,name=value。指針
ISO C 定義了一個函數 getenv,用於獲取環境變量值。code
#include <stdlib.h>blog
char *getenv(const char *name);進程
返回值:指向與name關聯的value的指針,若爲找到則返回NULL字符串
POSIX.1 定義了兩個函數 putenv 和 setenv,用於設置環境變量,
#include <stdlib.h>
int putenv(char *str);
返回值:若成功則返回0,若出錯則返回非0值
putenv 的參數是形式爲 name=value 的字符串的指針,將參數放到環境表中。若是 name 已經存在,則先刪除其原有的定義。
#include <stdlib.h>
int setenv(const char *name, const char *value, int rewrite);
返回值:若成功則返回0,若出錯則返回-1
setenv 函數將環境變量 name 的值設置爲 value。若是環境表中 name 已存在,那麼
• 若 rewrite 爲非 0 值,則首先刪除其現有定義。
• 若 rewrite 爲 0,則不刪除其現有定義,name 不設置爲新的 value,也不出錯。
另外提供了 unsetenv 函數用於刪除環境變量,
#include <stdlib.h>
int unsetenv(const char *name);
返回值:若成功則返回0,若出錯則返回-1
unsetenv 函數刪除 name 的定義,即便不存在環境變量 name 也不出錯。
例子:
#include <stdio.h> #include <stdlib.h> int main(void) { char *envVal; char *myenv; if ((envVal = getenv("PATH")) == NULL) { printf("not environment variable PATH\n"); } else { printf("PATH=%s\n", envVal); } if (setenv("myenv", "li enhua", 0) == -1) { printf("setenv error\n"); } else { myenv = getenv("myenv"); printf("myenv=%s\n", myenv); } if (putenv("myenv1=haha") != 0) { printf("putenv error\n"); } else { myenv = getenv("myenv1"); printf("myenv1=%s\n", myenv); } exit(0); }
編譯該程序,生成文件 envdemo,而後運行該文件,
lienhua34:demo$ gcc -o envdemo envdemo.c lienhua34:demo$ ./envdemo PATH=/usr/local/texlive/2013/bin/i386-linux:/usr/local/texlive/2013/bin/i386-linux:/ myenv=li enhua myenv1=haha
(done)