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;
}