C语言中,获取进程的CPU和内存使用情况需要借助操作系统提供的API。由于不同操作系统(Windows、Linux、macOS等)的API不同,实现方式也略有差异。可以通过读取系统特定的文件(如 Linux 上的 /proc/[pid]/stat 和 /proc/[pid]/status 文件)或使用 Windows API 函数(如 GetProcessTimes() 和 GetProcessMemoryInfo())来获取进程的 CPU 和内存使用情况。这些信息对于性能监控或调试非常有用。

1、 Linux

Linux 上,可以使用 /proc 文件系统,该文件系统提供了关于进程的很多信息。可以查看 /proc/[pid]/stat/proc/[pid]/status 文件来获取 CPU 和内存使用情况。

1)获取 CPU 使用情况

CPU 使用情况可以通过读取 /proc/[pid]/stat 文件来推算。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

long get_cpu_time(int pid) {
    char filename[256];
    snprintf(filename, sizeof(filename), "/proc/%d/stat", pid);

    FILE *fp = fopen(filename, "r");
    if (!fp) {
        perror("fopen");
        return -1;
    }

    long utime, stime;
    int pid_read;
    char comm[256];

    fscanf(fp, "%d %s %*c %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %ld %ld", 
           &pid_read, comm, &utime, &stime);
    fclose(fp);

    return utime + stime;
}

int main() {
    pid_t pid = getpid();
    long cpu_time = get_cpu_time(pid);
    printf("CPU 时间:%ld\n", cpu_time);
    return 0;
}

2)获取内存使用情况

内存使用情况可以通过 /proc/[pid]/status 文件获取,其中包含了多种内存统计信息。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

long get_memory_usage(int pid) {
    char filename[256];
    snprintf(filename, sizeof(filename), "/proc/%d/status", pid);

    FILE *fp = fopen(filename, "r");
    if (!fp) {
        perror("fopen");
        return -1;
    }

    long vmrss = 0;
    char line[256];
    while (fgets(line, sizeof(line), fp)) {
        if (strncmp(line, "VmRSS:", 6) == 0) {
            sscanf(line, "VmRSS: %ld kB", &vmrss);
            break;
        }
    }
    fclose(fp);

    return vmrss;
}

int main() {
    pid_t pid = getpid();
    long memory_usage = get_memory_usage(pid);
    printf("进程的内存使用情况:%ld kB\n", memory_usage);
    return 0;
}

2、Windows

Windows 上,你可以使用 Windows API 来查询内存和 CPU 使用情况。具体来说,可以使用 GetProcessTimes() 来获取 CPU 使用情况,使用 GetProcessMemoryInfo() 来获取内存使用情况。

1)获取 CPU 使用情况

可以使用 GetProcessTimes() 来获取进程在用户模式和内核模式下的时间。

#include <windows.h>
#include <stdio.h>

void get_cpu_usage(HANDLE process) {
    FILETIME creationTime, exitTime, kernelTime, userTime;
    if (GetProcessTimes(process, &creationTime, &exitTime, &kernelTime, &userTime)) {
        ULONGLONG kernel_ticks = *((ULONGLONG*)&kernelTime);
        ULONGLONG user_ticks = *((ULONGLONG*)&userTime);

        printf("内核时间:%llu, 用户时间:%llu\n", kernel_ticks, user_ticks);
    }
}

int main() {
    HANDLE process = GetCurrentProcess();
    get_cpu_usage(process);
    return 0;
}

2)获取内存使用情况

可以使用 GetProcessMemoryInfo() 函数来获取进程的内存使用情况,需要包含 Psapi.h 库。

#include <windows.h>
#include <psapi.h>
#include <stdio.h>

void get_memory_usage(HANDLE process) {
    PROCESS_MEMORY_COUNTERS pmc;
    if (GetProcessMemoryInfo(process, &pmc, sizeof(pmc))) {
        printf("工作集大小:%zu 字节\n", pmc.WorkingSetSize);
    }
}

int main() {
    HANDLE process = GetCurrentProcess();
    get_memory_usage(process);
    return 0;
}

推荐文档