You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux进程如何上报自身CPU及相关资源使用情况?

实现子进程单独上报资源使用情况的C方案

要让每个子进程单独输出自身的资源数据,直接用系统调用getrusage()就能搞定,不用依赖外部time命令——它只会统计当前进程的资源,不会汇总子进程数据,完美匹配你的需求。

核心思路

  1. 子进程启动时记录挂钟时间起点,用clock_gettime(CLOCK_MONOTONIC)(比time()更准确,不受系统时间修改影响)。
  2. 子进程退出前调用getrusage(RUSAGE_SELF, &usage),获取自身的CPU时间、IO等待等数据。
  3. 计算挂钟时间差值,把所有数据格式化输出即可。

代码示例

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 08:52:55