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

Linux 系統資訊獲取 C++ 類庫設計詳解

     編輯:關於C語言

在 Linux 系統程式開發中,即時獲取 CPU、記憶體、負載、網路流量、進程狀態等核心指標是監控、調度、容器化等場景的基礎。本文深度解析來自 mooon 專案的 CInfo 類,展示一個結構清晰、介面豐富、採用純 C++ 封裝 /proc 與系統調用的跨平台資訊採集元件。

核心資料結構

CInfo 在命名空間 SYS_NAMESPACE 內定義了六大 POD 結構體,涵蓋系統級與進程級指標:

1. 系統整體資訊 sys_info_t

  • uptime_second:開機至今秒數
  • average_load[3]:1/5/15 分鐘負載
  • ram_total / free / shared / buffer:主記憶體細分統計
  • swap_total / free:交換空間統計
  • process_number:當前進程總數

2. 進程時間資訊 process_time_t

記錄用戶態/核心態 CPU 時間,含子進程累計值,單位為 jiffies (通常 1/100 秒)。

3. CPU 詳細資訊 cpu_info_t

提供總計、用戶態、nice、核心態、閒置、I/O 等待、硬/軟中斷等細分計數器,支援多核心陣列查詢 get_cpu_info_array。

4. 記憶體資訊 mem_info_t

對應 /proc/meminfo 關鍵欄位:total/free/buffers/cached/swap 等。

5. 核心版本 kernel_version_t

結構化拆解 major/minor/revision,便於版本判斷 (minor 偶數為穩定版)。

6. 進程狀態詳情 process_info_t (38 欄位)

完整映射 /proc/[pid]/stat,涵蓋 PID、狀態碼 (R/S/D/Z...)、父/組/會話 ID、頁錯誤、調度時間、優先級、執行緒數、虛擬/常駐記憶體、代碼/堆棧地址、信號位圖、CPU 親和性等。

7. 網卡流量 net_info_t

單網卡收發位元組/封包/錯誤/丟包/衝突/載波等計數器,支援單卡 get_net_info 與全卡陣列 get_net_info_array。

8. 進程分頁資訊 process_page_info_t

以頁為單位統計代碼段、資料段、庫、共享、常駐集大小。

公開介面一覽

方法說明
get_sys_info(sys_info_t&)系統整體快照
get_mem_info(mem_info_t&)記憶體使用詳情
get_cpu_info(cpu_info_t&)總 CPU 統計
get_cpu_info_array(vector<cpu_info_t>&)每核心 CPU 統計
get_kernel_version(kernel_version_t&)核心版本號
get_process_info(process_info_t&)當前進程完整狀態
get_process_page_info(process_page_info_t&)進程分頁統計
get_process_times(process_time_t&)進程 CPU 時間
get_net_info(iface, net_info_t&)指定網卡流量
get_net_info_array(vector<net_info_t>&)所有網卡流量

設計亮點

  • 靜態介面:所有方法均為 static,無需實例化,適合作為工具類調用。
  • RAII 風格:以結構體承載資料,避免繁瑣的 getter/setter,效能與可讀性並重。
  • 跨版本兼容:cpu_info_t 中保留 stealstolen/guest 註解欄位,適配 2.6.11/2.6.24+ 核心新增指標。
  • 流量計算就緒:net_info_t 直接提供累計計數器,應用層只需兩次採樣相減除以間隔即得即時帶寬。

典型應用場景

  1. 服務端監控 Agent:定時採集 sys_info_t/cpu_info_t/mem_info_t 上報 Prometheus/Open-Falcon。
  2. 容器資源配額校驗:讀取 process_info_t.vsize/rss 判斷是否超限。
  3. 網路帶寬自適應:get_net_info_array 計算各網卡實時吞吐,動態調整傳輸策略。
  4. 核心相容性檢查:部署腳本啟動時調用 get_kernel_version 確認最低版本需求。

原始碼獲取

完整實現 (含 info.cpp 解析 /proc/stat//proc/meminfo//proc/net/dev 等) 可至專案倉庫瀏覽:
info.cpp 原始碼

來源:飛月博客

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