通過分析 ps 系統調用與 /proc 虛擬文件系統,使用 C 語言實現進程信息遍歷顯示,深度理解 Linux 進程管理機制。
ps 顯示進程快照信息strace ps 發現讀取 /proc/[pid]/stat 和 /proc/[pid]/status/proc 下純數字目錄對應進程 PID
#define MAX_LEN 20
typedef struct ps_info {
char pname[MAX_LEN]; // 進程名
char user[MAX_LEN]; // 用戶名
int pid; // 進程ID
int ppid; // 父進程ID
char state; // 狀態(R/S/D/Z等)
struct ps_info *next; // 鏈表指針
} mps;
opendir/readdir 獲取數字目錄stat() 獲取 UID → getpwuid() 轉用戶名
// 遍歷 /proc 目錄
DIR *dir_ptr = opendir("/proc");
struct dirent *direntp;
while ((direntp = readdir(dir_ptr)) != NULL) {
if (is_num(direntp->d_name)) { // 純數字目錄名
read_info(direntp->d_name, p1); // 讀取進程信息
// 鏈表插入邏輯...
}
}
// 解析 /proc/pid/stat
fscanf(fd, "%d %s %c %d", &pid, pname, &state, &ppid);
// UID 轉用戶名
struct passwd *pw_ptr = getpwuid(uid);
strcpy(ps_info->user, pw_ptr ? pw_ptr->pw_name : uid_string);
gcc ps.c -o myps
./myps
# 輸出格式:
USER PID PPID STATE PNAME
root 1 0 S systemd
...
/proc 文件系統接口這是 Linux 系統編程入門的優秀實戰項目。