承接上一篇「檢視 main 函式參數」,本文進一步介紹如何查詢行程的完整資訊(PID、狀態、記憶體、執行緒、信號等),屬「一起 talk C 栗子吧」系列第 128 回內容。
/proc/self 自動定位當前行程cat /proc/self/cmdline # 直接顯示當前 Shell/指令的命令列參數,無需知道 PID
self 為核心提供的魔術符號連結,永遠指向發起系統呼叫的行程目錄。
ps 指令快速概覽ps -x # 輸出範例: # PID TTY STAT TIME COMMAND # 2731 pts/1 Ss 0:00 bash # 2943 pts/1 R+ 0:00 ps -x
aux(所有行程詳細)、-ef(完整格式)、-T(顯示執行緒)/proc/PID/statuscat /proc/self/status
| 欄位 | 含義 | 範例值 |
|---|---|---|
Name | 程式名稱 | cat |
State | 行程狀態 | R (running) / S (sleeping) / D (disk sleep) / Z (zombie) |
Tgid | 執行緒群組 ID(主執行緒 PID) | 2994 |
Pid | 行程 ID | 2994 |
PPid | 父行程 ID | 2731 |
Uid/Gid | 實際/有效/儲存/檔案系統 UID/GID | 1000 1000 1000 1000 |
VmPeak/VmSize | 虛擬記憶體峰值/目前大小 | 5924 kB |
VmRSS | 駐留記憶體大小(實體 RAM 佔用) | 540 kB |
VmData/VmStk/VmExe | 資料段/堆疊/程式碼段大小 | 160/136/44 kB |
Threads | 執行緒數量 | 1 |
SigQ | 排隊信號/最大佇列 | 0/31070 |
CapEff/CapPrm/CapInh | 有效/允許/繼承能力位圖 | 0000000000000000 |
Cpus_allowed | 允許執行的 CPU 核心位圖 | f (0-3) |
voluntary_ctxt_switches | 自願上下文切換次數 | 1 |
nonvoluntary_ctxt_switches | 非自願(被搶佔)切換次數 | 1 |
status vs ps 選擇指南| 需求 | 推薦工具 |
|---|---|
| 快速列出所有行程 PID 與命令 | ps -ef / ps aux |
| 查詢特定行程完整記憶體/執行緒/信號細節 | cat /proc/PID/status |
| 腳本自動化解析 | /proc 格式固定,易於 grep/awk 處理 |
| 即時互動式監控 | top / htop / pidstat |
// 取得自身 PID
pid_t pid = getpid();
// 組路徑讀取 status
char path[64];
snprintf(path, sizeof(path), "/proc/%d/status", pid);
FILE *fp = fopen(path, "r");
if (fp) {
char line[256];
while (fgets(line, sizeof(line), fp)) {
if (strncmp(line, "VmRSS:", 6) == 0) {
printf("RSS: %s", line + 7);
break;
}
}
fclose(fp);
}
/proc 可能被遮罩,PID 命名空間隔離導致宿主機 PID 不同VmRSS 反映容器限制內的記憶體使用cgroup 檔案 (/sys/fs/cgroup/memory/) 獲取配額資訊掌握 /proc、ps、status 三大查詢工具,能在開發、除錯、效能分析、容器運維等場景快速定位行程行為,是 Linux 系統級工程師的核心基本功。