首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Linux 系統程式設計筆記(三):環境變數、記憶體分配、用戶組資訊完整 API 速查

     編輯:關於C語言

進程環境、堆記憶體管理、用戶認證資訊核心介面

接續檔案 I/O,本文整理 Linux 進程環境操作、動態記憶體分配族群、用戶/群組資料庫查詢三大核心 API 群組,附帶常見陷阱與安全實務。

一、進程環境與環境變數

函式原型說明
getpidpid_t getpid(void);取得當前進程 ID,永遠成功
getenvchar *getenv(const char *name);查詢環境變數,不存在回傳 NULL,回傳指標指向進程環境表,勿修改/釋放
putenvint putenv(char *string);格式 "NAME=value",**string 直接成為環境表一部分**,必須靜態/動態分配,不可用區域陣列
setenvint setenv(const char *name, const char *value, int overwrite);更安全:核心複製字串,overwrite=1 覆蓋既有,回傳 0 成功
unsetenvint unsetenv(const char *name);移除環境變數,回傳 0 成功

陷阱:putenv 傳入區域變數指標 → 函數返回後指標失效 → 環境表損毀。永遠使用 setenv 或確保字串生命週期覆蓋進程壽命。

二、動態記憶體分配

函式原型特性
mallocvoid *malloc(size_t size);分配 size 位元組,**不初始化**,內容不定
freevoid free(void *ptr);釋放,**同一指標釋放兩次導致未定義行為 (double free)**
callocvoid *calloc(size_t nmemb, size_t size);分配 nmemb × size 位元組,**全零初始化**,整數溢位檢查較 malloc 完整
reallocvoid *realloc(void *ptr, size_t size);調整大小,**可能移動記憶體**,舊指標失效,**必須用回傳值更新指標**

安全分配包裝器模式

void *xmalloc(size_t size) {
    void *p = malloc(size);
    if (!p) { perror("malloc"); exit(EXIT_FAILURE); }
    return p;
}
void *xrealloc(void *ptr, size_t size) {
    void *p = realloc(ptr, size);
    if (!p) { perror("realloc"); exit(EXIT_FAILURE); }
    return p;
}
void xfree(void *ptr) { if (ptr) free(ptr); } // 可容忍 NULL

三、用戶/群組資料庫 (/etc/passwd, /etc/shadow, /etc/group)

函式族群關鍵函式說明
用戶查詢getpwnam, getpwuid依名稱/UID 查詢,回傳 struct passwd* 指向靜態緩衝區,**非執行緒安全**
用戶遍歷setpwent, getpwent, endpwent順序讀取 /etc/passwd,**單執行緒迭代器**,並發需鎖定
群組查詢getgrnam, getgrgid依名稱/GID 查詢,回傳 struct group*
群組遍歷setgrent, getgrent, endgrent順序讀取 /etc/group
Shadow 密碼getspnam, getspent 族群需 root 權限讀取 /etc/shadow,含加密密碼、過期資訊

執行緒安全版本 (POSIX.1c)

  • getpwnam_r, getpwuid_r:呼叫者提供緩衝區
  • getgrnam_r, getgrgid_r
  • 回傳 int 錯誤碼,結果經輸出參數回傳

四、進程認證與權限

概念取得函式設定函式說明
真實 UIDgetuid()setuid(uid_t)進程啟動者身分
有效 UIDgeteuid()seteuid(uid_t)決定檔案存取權限檢查
真實 GIDgetgid()setgid(gid_t)進程啟動者群組
有效 GIDgetegid()setegid(gid_t)決定檔案存取權限檢查

Set-UID 程式權限降級模式

// 暫時放棄 root 權限執行敏感操作
uid_t ruid, euid, suid;
getresuid(&ruid, &euid, &suid);
seteuid(ruid); // 降級為真實用戶
// 執行不需特權的操作 (如開啟用戶檔案)
seteuid(euid); // 恢復特權

原則:最小權限、盡快降級、用畢即還。

常見安全錯誤

  1. 信任環境變數 (PATH, LD_LIBRARY_PATH) 執行外部程式
  2. getpwnam 等非 _r 版本在多執行緒程式中並發調用導致資料競爭
  3. realloc 失敗未檢查,導致記憶體洩漏 (舊指標未釋放)
  4. Set-UID 程式未檢查 geteuid 即執行危險操作

掌握環境、記憶體、身分三大核心子系統 API,是編寫健壯、安全 Linux 系統軟體(Daemon、Container Runtime、CLI 工具)的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved