unix中的環境表、環境變量(environ、getenv、setenv、putenv)

  • 環境表

    每個程序都有一張環境表。與參數表一樣,環境表也是一個字符指針數組,其中每個指針包含一個以null結束的c字符串地址。

    全局變量environ則包含了該指針數組的地址:extern char ** environ;
    如下程序可以打印環境表。

#include <stdio.h>
#include <stdlib.h>

extern char  ** environ;
int main()
{
	int i;
	for(i=0;environ[i]!=NULL;i++)
	{
		puts(environ[i]);
	}
	exit(0);
}

環境表中的環境變量的值大多數預定義爲全大寫字母。

在歷史上,大多數UNIX系統支持main函數帶三個參數:

	int main(int argc,char ** argv,char ** envp[]);

其中的第三個參數就是環境表。

POSIX.1規定應該使用environ而不使用第三個參數。

通常使用getnev和putenv來訪問特定的環境變量,而不是environ變量。如果要查看整個環境,還是隻能使用environ指針。

  • getenv

    • 函數定義
         #include <stdlib.h>
      
         char *getenv(const char *name);
      
    • 功能描述
      getnev通過name在環境表中搜索,如果成功,則返回該項的值,否則返回NULL。
      • 注意事項
        • 環境表中的字符串都是 以類似於 name=value 方式存放。
        • 在大部分的系統實現中,getenv返回一個指向環境表中的某項的指針。
        • 調用者必須特別小心,不要修改getenv返回來的指針所指向的內容,因爲這樣很可能會導致修改進程環境。
        • getenv不要求是可重入的。getenv返回的值是可以靜態分配的,而且可以被如下一系列的函數所改變(getenv(), putenv(3), setenv(3), or unsetenv(3).)。
  • setenv、unsetenv

    • 函數定義
         #include <stdlib.h>
      
         int setenv(const char *name, const char *value, int overwrite);
      
         int unsetenv(const char *name);
      
    • 功能描述
      • setenv修改或者增加環境變量。如果環境中沒有name環境變量,則setnev增加該環境變量,並把值設爲value。如果有該環境變量,則根據overwrite的值來決定。overwrite爲非0值,則覆蓋之前的;overwrite爲0,則不覆蓋。
      • 如果要覆蓋,則setenv會釋放原來該name字段存放的空間,再重新分配空間,把value存儲進去。
      • unsetenv刪除環境表中的name字段。如果沒有該字段,也執行成功,只是環境表沒有變化。
    • 返回值
      • setenv:執行成功,返回0;如果環境表空間不足,返回-1。
      • unsetenv:執行成功,返回0;失敗返回-1,並設置errno。
  • putenv

      #include <stdlib.h>
    
       int putenv(char *string);
    
    • 可以注意到putenv的變量沒有const修飾,而getenv、setenv、unsetenv都有const修飾,所以putenv不太安全,一般不使用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章