- Linux程序設計(第4版)
- (英)Neil Matthew Richard Stones
- 1297字
- 2021-04-09 20:04:47
4.2 環境變量
我們在第2章討論過環境變量。這是一些能用來控制shell腳本和其他程序行為的變量。你還可以用它們來配置用戶環境。例如,每個用戶有一個環境變量HOME,它定義了用戶的家目錄,即該用戶會話的默認開始位置。正如你已看到的,你可以在shell提示符中檢查環境變量:

你也可以使用shell的set命令來列出所有的環境變量。
UNIX規范為各種應用定義了許多標準環境變量,包括終端類型、默認的編輯器、時區等。C語言程序可以通過putenv和getenv函數來訪問環境變量。

環境由一組格式為“名字=值”的字符串組成。getenv函數以給定的名字搜索環境中的一個字符串,并返回與該名字相關的值。如果請求的變量不存在,它就返回null。如果變量存在但無關聯值,它將運行成功并返回一個空字符串,即該字符串的第一個字節是null。由于getenv返回的字符串是存儲在getenv提供的靜態空間中,所以如果想進一步使用它,你就必須將它復制到另一個字符串中,以免它被后續的getenv調用所覆蓋。
putenv函數以一個格式為“名字=值”的字符串作為參數,并將該字符串加到當前環境中。如果由于可用內存不足而不能擴展環境,它會失敗并返回-1。此時,錯誤變量errno將被設置為ENOMEM。
在下面的實驗中,你將編寫一個程序來打印所選的任意環境變量的值。如果給程序傳遞第二個參數,你還將設置環境變量的值。
實驗getenv和putenv
(1)緊接在main函數聲明后的幾行代碼用于確保程序environ.c被正確調用,它只帶有一個或兩個參數:

(2)然后,調用getenv從環境中取出變量的值:

(3)接下來,檢查程序調用時是否有第二個參數。如果有,則通過構造一個格式為“名字=值”的字符串并調用putenv來設置變量的值:

(4)最后,再次調用getenv來查看變量的新值:

運行這個程序,你可以查看和修改環境變量:

注意:環境僅對程序本身有效。你在程序里做的改變不會反映到外部環境中,這是因為變量的值不會從子進程(你的程序)傳播到父進程(shell)。
4.2.1 環境變量的用途
程序經常使用環境變量來改變它們的工作方式。用戶可以通過以下方式設置環境變量的值:在默認環境中設置、通過登錄shell讀取的.profile文件來設置、使用shell專用的啟動文件(rc)或在shell命令行上對變量進行設定。例如:

shell將行首的變量賦值作為對環境變量的臨時改變。在上面的第二個例子中,程序environ將運行在一個變量FRED有一個賦值的環境中。
舉個例子,在CD數據庫應用程序的未來版本中,你可以通過改變一個環境變量,比如CDDB,來指定所用的數據庫。這樣,每個用戶就能指定自己的默認值,或者在每次運行時使用shell命令來設定:

或

環境變量是一把雙刃劍,使用它的時候要小心!與命令行選項相比,它們對用戶來說更加“隱蔽”,這樣就使得程序的調試變得更加困難。從某種意義上來說,環境變量就像全局變量一樣,它們會改變程序的行為,產生不可預期的結果。
4.2.2 environ變量
正如你已看到的,程序的環境由一組格式為“名字=值”的字符串組成。程序可以通過environ變量直接訪問這個字符串數組。environ變量的聲明如下所示:

實驗environ變量
下面這個程序showenv.c使用environ變量打印環境變量:

當在Linux系統中運行該程序時,你將得到如下的輸出(略做刪減)。這些變量的數目、出現順序和值取決于操作系統的版本、所用的shell以及程序運行時的用戶設置。

實驗解析
這個程序遍歷environ變量(一個以null結尾的字符串數組),并打印出整個環境。
- Vue.js設計與實現
- 自己動手寫搜索引擎
- C++ Builder 6.0下OpenGL編程技術
- Mastering Concurrency in Go
- Bulma必知必會
- UML+OOPC嵌入式C語言開發精講
- Python GUI Programming Cookbook
- Java Web基礎與實例教程
- 零基礎學Python網絡爬蟲案例實戰全流程詳解(高級進階篇)
- Java程序設計
- 深入分布式緩存:從原理到實踐
- Python圖形化編程(微課版)
- Cocos2d-x by Example:Beginner's Guide(Second Edition)
- 交互式程序設計(第2版)
- Moodle 3 Administration(Third Edition)