在 Linux 系统编程中,获取系统或进程级别的 CPU 与内存使用信息是常见需求。传统方法包括解析 top 命令输出,或直接读取 /proc/{pid}/stat 文件。本文介绍一种更简便、灵活的替代方案:使用 libgtop 库。该库提供了跨平台的系统监控接口,能以统一的方式获取全局或特定进程的资源占用数据,代码编写更直观,维护成本更低。
在开始编码前,请确保系统已安装 libgtop-2.0 及其依赖 glib-2.0。大多数发行版可通过包管理器直接安装:
# Debian/Ubuntu
sudo apt-get install libgtop2-dev
# CentOS/RHEL
sudo yum install libgtop2-devel
安装完成后,头文件通常位于 /usr/include/libgtop-2.0/,链接时需加入 -lgtop-2.0 -lglib-2.0。
libgtop 通过一组结构体封装系统信息,常用的包括:
glibtop_cpu — 系统整体 CPU 时间统计(用户态、系统态、空闲等)glibtop_mem — 物理内存总量、已用、空闲等glibtop_proc_time — 指定进程的 CPU 时间glibtop_proc_mem — 指定进程的内存驻留集大小对应的获取函数分别为 glibtop_get_cpu()、glibtop_get_mem()、glibtop_get_proc_time()、glibtop_get_proc_mem()。
下面的完整程序演示如何启动一个子进程(如 mplayer),并每秒采样一次其资源使用率。
#include <stdio.h>
#include <glibtop.h>
#include <glibtop/cpu.h>
#include <glibtop/mem.h>
#include <glibtop/proctime.h>
#include <glibtop/procmem.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
if (argc < 2) {
fprintf(stderr, "Usage: %s [args...]\n", argv[0]);
return 1;
}
glibtop_cpu cpu_begin, cpu_end;
glibtop_proc_time proctime_begin, proctime_end;
glibtop_mem memory;
glibtop_proc_mem procmem;
int du, dn, ds, di;
int dpu, dps;
float cpurate, memrate;
pid_t pid = fork();
if (pid == 0) { // 子进程:执行目标程序
execvp(argv[1], &argv[1]);
perror("execvp failed");
return 1;
} else { // 父进程:监控循环
while (1) {
glibtop_get_cpu(&cpu_begin);
glibtop_get_proc_time(&proctime_begin, pid);
sleep(1); // 采样间隔 1 秒
glibtop_get_cpu(&cpu_end);
glibtop_get_proc_time(&proctime_end, pid);
// 计算系统总 CPU 时间增量
du = cpu_end.user - cpu_begin.user;
dn = cpu_end.nice - cpu_begin.nice;
ds = cpu_end.sys - cpu_begin.sys;
di = cpu_end.idle - cpu_begin.idle;
// 计算目标进程 CPU 时间增量
dpu = proctime_end.utime - proctime_begin.utime;
dps = proctime_end.stime - proctime_begin.stime;
// CPU 使用率 = 进程占用时间 / 系统总时间 * 100%
cpurate = 100.0 * (dpu + dps) / ((du + dn + ds + di) * 1.0);
// 内存使用率 = 进程驻留内存 / 物理总内存 * 100%
glibtop_get_mem(&memory);
glibtop_get_proc_mem(&procmem, pid);
memrate = 100.0 * procmem.resident / (memory.total * 1.0);
fprintf(stderr, "CPU: %.2f%% MEM: %.2f%%\n", cpurate, memrate);
}
}
return 0;
}
gcc procmonitor.c -o procmonitor \
-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include \
-I/usr/include/libgtop-2.0 \
-lgtop-2.0 -lglib-2.0
# 示例:监控 mplayer 播放视频
./procmonitor mplayer movie.mkv 2> info.txt
程序会将采样结果输出到标准错误,可用重定向保存到文件供后续分析。
glib-2.0 与 libgtop-2.0,否则会出现未定义符号错误。/usr/include/libgtop-2.0/ 下,遇到字段不确定时可直接查阅头文件。top 显示的进程 CPU% 通常基于单核计算(即 100% 代表占满一个核心),而本示例计算的是所有核心平均使用率。若需与 top 结果一致,可使用 glibtop_proc_time 中的 xcpu_utime[GLIBTOP_NCPU] 与 xcpu_stime[GLIBTOP_NCPU] 分别获取每个核心的时间,再按单核口径计算。libgtop 封装了底层 /proc 解析细节,提供了清晰、可移植的 C API,极大降低了系统监控工具的开发门槛。无论是编写轻量级资源采集器,还是集成到大型运维平台,它都是值得考虑的选择。