在 Linux 環境開發除錯時,若需在程式執行期間查看 main(int argc, char *argv[]) 接收的命令列參數,不想修改原始碼重新編譯,可善用 /proc 虛擬檔案系統。本技巧屬「一起 talk C 栗子吧」系列第 127 回內容。
/proc:Linux 核心暴露行程資訊的虛擬檔案系統/proc/PID/ 目錄(PID 為行程識別碼)/proc/PID/cmdline:儲存該行程完整命令列參數(以 \0 分隔)// test_args.c
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int i = 0;
while (i++ < argc * 3) sleep(1); // 保持執行足夠時間供檢視
return 0;
}
gcc test_args.c -o test_args ./test_args -a -b & # 背景執行,傳遞 -a -b 兩個參數 # 輸出範例:[1] 3231 (3231 為 PID)
cat /proc/3231/cmdline # 輸出:./test_args-a-b (參數間以 \0 分隔,cat 顯示為連續字串)
若需可讀格式:
cat /proc/3231/cmdline | tr '\0' ' ' # 輸出:./test_args -a -b
/proc/self 自動鎖定當前行程在 Shell 或程式中,self 符號連結自動指向目前行程的目錄:
cat /proc/self/cmdline # 直接顯示當前指令的參數,無需查詢 PID
| 維度 | 程式碼列印 (printf argv) | /proc 檢視法 |
|---|---|---|
| 需修改原始碼 | 是 | 否 |
| 需重新編譯 | 是 | 否 |
| 適用執行中行程 | 否(除非預留信號處理) | 是 |
| 適用無原始碼程式 | 否 | 是 |
| 參數格式 | 自定義 | 原始 \0 分隔 |
/proc/PID/ 其他實用檔案environ:環境變數(\0 分隔)status:行程狀態、記憶體使用、執行緒數、信號遮罩等fd/:開啟檔案描述符連結maps:記憶體映射區段stack:堆疊內容(需權限)善用 /proc 檔案系統,能在不干擾執行中程式的前提下,快速獲取關鍵診斷資訊,是 Linux 系統程式開發者與運維人員的必備技能。