環境變量是進程間傳遞配置、狀態、路徑的標準機制。Linux 提供 getenv 讀取、putenv/setenv 設置、unsetenv 刪除四大核心函數。本文詳細解析各函數語義、參數、返回值、錯誤碼,並給出實戰代碼與工程避坑指南。
getenv:讀取環境變量char *getenv(const char *name);
NULL。secure_getenv 或加鎖。char *user = getenv("USER");
if (user) printf("USER=%s\n", user);
putenv:設置/修改 (字串形式)int putenv(char *string);
string 格式 "NAME=VALUE",**必須是持久內存** (全局/靜態/堆分配),**不能是棧上臨時字串**!函數直接將指針掛入環境表。errno=ENOMEM )。// 錯誤示範:棧上字串,函數返回後失效
// putenv("TEMP=value");
// 正確:靜態/堆內存
static char env_buf[] = "MYVAR=123";
putenv(env_buf);
setenv:設置/修改 (分離參數,更安全)int setenv(const char *name, const char *value, int overwrite);
overwrite=1:強制覆蓋;overwrite=0:存在則保留舊值。ENOMEM )。setenv("USER", "test", 1); // 強制改為 test
setenv("NEW_VAR", "value", 0); // 不存在則創建
unsetenv:刪除環境變量int unsetenv(const char *name);
name,不存在不報錯。unsetenv("USER"); // 刪除後 getenv 返回 NULL
#include <stdlib.h>
#include <stdio.h>
int main() {
char *p;
// 1. 讀取原值
if ((p = getenv("USER"))) printf("原 USER=%s\n", p);
// 2. setenv 修改 (推薦)
setenv("USER", "test", 1);
printf("修改後 USER=%s\n", getenv("USER"));
// 3. 刪除
unsetenv("USER");
printf("刪除後 USER=%s\n", getenv("USER") ? "存在" : "NULL");
// 4. putenv 用法 (需持久緩衝區)
static char buf[] = "CUSTOM_VAR=hello";
putenv(buf);
printf("putenv 設置: %s\n", getenv("CUSTOM_VAR"));
return 0;
}
setenv/putenv/unsetenv 需加鎖 (pthread_mutex)。fork 後子進程複製父進程環境表,修改互不影響;exec 載入新程序時環境表隨進程映像替換 (除非顯式傳遞)。clearenv() (GNU 擴展) 或遍歷 environ 逐個 unsetenv。讀用 getenv,寫用 setenv,刪用 unsetenv,慎用 putenv (注意指針壽命)。 環境變量操作看似簡單,實則關係進程隔離、線程安全、內存管理,掌握細節才能寫出健壯的系統級代碼。