编写 函数 输入进程id输出它的利用率
时间: 2024-03-10 12:46:50 浏览: 51
要计算进程的利用率,需要了解进程的 CPU 时间,以及系统的 CPU 时间。可以使用 `/proc/<pid>/stat` 文件来获取进程的 CPU 时间,使用 `/proc/stat` 文件来获取系统的 CPU 时间。具体计算方式如下:
1. 读取 `/proc/<pid>/stat` 文件,获取进程的 CPU 时间信息。文件的第 14 到 17 个字段分别代表进程在用户态和内核态下运行的 CPU 时间,单位是时钟滴答数(clock ticks)。
2. 读取 `/proc/stat` 文件,获取系统的 CPU 时间信息。文件的第 1 到 10 个字段分别代表系统在用户态和内核态下运行的 CPU 时间,以及空闲时间等信息,单位也是时钟滴答数。
3. 计算进程的 CPU 时间占总 CPU 时间的比例。具体计算方式为:进程的 CPU 时间 / (系统的 CPU 时间 - 系统空闲时间)。
下面是一个示例函数,输入进程 PID,输出它的 CPU 利用率:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 1024
int get_process_cpu_usage(int pid) {
char proc_file_path[BUF_SIZE];
char buf[BUF_SIZE];
int user_time, kernel_time;
unsigned long long system_time, idle_time, total_time;
double cpu_usage;
// 获取进程 CPU 时间
snprintf(proc_file_path, BUF_SIZE, "/proc/%d/stat", pid);
FILE* proc_file = fopen(proc_file_path, "r");
if (!proc_file) {
perror("Failed to open proc file");
return -1;
}
if (!fgets(buf, BUF_SIZE, proc_file)) {
perror("Failed to read proc file");
fclose(proc_file);
return -1;
}
fclose(proc_file);
char* p = strtok(buf, " ");
for (int i = 1; i <= 17 && p; i++) {
if (i == 14) {
user_time = atoi(p);
} else if (i == 15) {
kernel_time = atoi(p);
}
p = strtok(NULL, " ");
}
// 获取系统 CPU 时间
proc_file = fopen("/proc/stat", "r");
if (!proc_file) {
perror("Failed to open proc file");
return -1;
}
if (!fgets(buf, BUF_SIZE, proc_file)) {
perror("Failed to read proc file");
fclose(proc_file);
return -1;
}
fclose(proc_file);
p = strtok(buf, " ");
for (int i = 1; i <= 10 && p; i++) {
if (i == 1) {
p++; // 跳过第一个字段
system_time = atoll(p);
} else if (i == 4) {
idle_time = atoll(p);
}
p = strtok(NULL, " ");
}
total_time = system_time + idle_time; // 计算总 CPU 时间
// 计算 CPU 利用率
cpu_usage = (user_time + kernel_time) * 100.0 / (total_time - idle_time);
return (int)cpu_usage;
}
int main(int argc, char* argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <pid>\n", argv[0]);
return 1;
}
int pid = atoi(argv[1]);
int cpu_usage = get_process_cpu_usage(pid);
if (cpu_usage < 0) {
fprintf(stderr, "Failed to get process CPU usage\n");
return 1;
}
printf("Process %d CPU usage: %d%%\n", pid, cpu_usage);
return 0;
}
```
这个函数首先打开 `/proc/<pid>/stat` 文件和 `/proc/stat` 文件,读取进程的 CPU 时间和系统的 CPU 时间。然后计算进程的 CPU 利用率,最后返回一个整数型的利用率。你可以在命令行中运行这个程序,输入进程的 PID,它会输出该进程的 CPU 利用率。
阅读全文