Linux进程如何上报自身CPU及相关资源使用情况?
实现子进程单独上报资源使用情况的C方案
要让每个子进程单独输出自身的资源数据,直接用系统调用getrusage()就能搞定,不用依赖外部time命令——它只会统计当前进程的资源,不会汇总子进程数据,完美匹配你的需求。
核心思路
- 子进程启动时记录挂钟时间起点,用
clock_gettime(CLOCK_MONOTONIC)(比time()更准确,不受系统时间修改影响)。 - 子进程退出前调用
getrusage(RUSAGE_SELF, &usage),获取自身的CPU时间、IO等待等数据。 - 计算挂钟时间差值,把所有数据格式化输出即可。
代码示例
#include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <sys/resource.h> #include <time.h> #include <unistd.h> #include <sys/wait.h> int main() { // 示例:创建3个不同工作类型的子进程 for (int i = 0; i < 3; i++) { pid_t pid = fork(); if (pid == -1) { perror("fork failed"); exit(EXIT_FAILURE); } if (pid == 0) { // 子进程:记录启动时刻 struct timespec start_ts; clock_gettime(CLOCK_MONOTONIC, &start_ts); // 替换成你的子进程实际工作逻辑 if (i == 0) sleep(1); // 模拟纯等待 else if (i == 1) { // 模拟CPU密集型工作 volatile long long cnt = 0; for (long long j = 0; j < 1e9; j++) cnt++; } else { // 模拟IO密集型工作 FILE *fp = fopen("/dev/null", "w"); for (long long j = 0; j < 1e6; j++) fprintf(fp, "%lld\n", j); fclose(fp); } // 获取当前进程资源使用数据 struct rusage usage; getrusage(RUSAGE_SELF, &usage); // 计算挂钟时间(秒) struct timespec end_ts; clock_gettime(CLOCK_MONOTONIC, &end_ts); double elapsed = (end_ts.tv_sec - start_ts.tv_sec) + (end_ts.tv_nsec - start_ts.tv_nsec) / 1e9; // 转换CPU时间为秒 double user_cpu = usage.ru_utime.tv_sec + usage.ru_utime.tv_usec / 1e6; double sys_cpu = usage.ru_stime.tv_sec + usage.ru_stime.tv_usec / 1e6; // Linux下支持IO等待时间,部分BSD系统可能无此字段 double io_wait = usage.ru_iowait.tv_sec + usage.ru_iowait.tv_usec / 1e6; // 格式化输出,可根据需求调整字段顺序和精度 printf("子进程PID: %5d | 挂钟时间: %.2fs | 用户态CPU: %.2fs | 内核态CPU: %.2fs | IO等待: %.2fs\n", getpid(), elapsed, user_cpu, sys_cpu, io_wait); exit(EXIT_SUCCESS); } } // 父进程等待所有子进程结束 while (wait(NULL) > 0); return 0; }
关键细节说明
RUSAGE_SELF:指定只统计当前进程的资源,不会包含任何子进程的数据,完全符合你要的“每个子进程单独上报”需求。- CPU时间计算:
ru_utime是用户态总CPU时间(多线程时会累加所有线程的时间,可能超过挂钟时间),ru_stime是内核态总时间。 - 兼容性:
rusage结构体的字段在不同UNIX-like系统上略有差异,比如ru_iowait是Linux特有的,BSD系统可能没有,需要根据目标系统调整代码。 - 编译注意:Linux下编译需要链接
rt库,用命令gcc -o proc_stats proc_stats.c -lrt。
内容的提问来源于stack exchange,提问作者fadedbee
相关产品推荐
相关产品推荐

