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

C語言實現 Linux ps 命令:/proc 文件系統解析與進程遍歷

     編輯:關於C語言

從零實現簡易 ps 命令:Linux /proc 文件系統實戰

通過分析 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;

核心流程

  1. 遍歷 /proc:opendir/readdir 獲取數字目錄
  2. 讀取 stat 文件:解析前 4 個字段(pid, comm, state, ppid)
  3. 獲取用戶名:stat() 獲取 UID → getpwuid() 轉用戶名
  4. 鏈表串聯:動態分配節點構建進程列表
  5. 格式化輸出:打印 USER, PID, PPID, STATE, PNAME

關鍵代碼片段


// 遍歷 /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 進程元數據組織
  • 實踐目錄遍歷、文件解析、鏈表管理
  • 體會系統工具底層實現原理

這是 Linux 系統編程入門的優秀實戰項目。

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