【发布时间】:2021-12-04 03:40:13
【问题描述】:
我正在尝试创建一个程序监视器系统参数,例如:CPU 使用百分比、Ram 使用百分比,并在百分比超过 80% 时发送警告日志。我在读取 CPU 百分比时的解决方案是使用 mpstat 或 cat /proc/stat 如下:
unsigned int get_system_value(char *command)
{
FILE *fp;
char value_string[1024];
fflush(fp);
fp = popen(command, "r"); /* The issue is here */
if (fp == NULL) {
printf("Failed to check command system \n" );
return -1;
}
while (fgets(value_string, sizeof(value_string), fp) != NULL);
unsigned int value = atoi(value_string);
return value;
pclose(fp);
}
void *get_sys_stat(void* arg)
{
float cpu_percent = 0;
int cpu_high_flag = 0;
int cpu_too_high_flag = 0;
while(1) {
// cpu_percent = get_system_value("mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12"" }'"); // using mpstat
cpu_percent = get_system_value("grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage}'"); // using cat /proc/stat
if (cpu_percent > 80) {
trap_cpu_high(ar_general_config[0].general_id); // send warning log
}
}
}
问题是当我在几分钟后运行程序时,我将无法打开文件,指针fp 是NULL。我来宾说 Linux 会阻止程序打开文件太多次,或者可能无法运行 bash 命令太多次。你能帮我解释一下为什么吗?以及针对这种情况的解决方案。
【问题讨论】:
-
为什么要使用
popen调用命令读取文件?只需直接打开文件并阅读即可。 -
因为我需要 shell 命令的返回值。我参考这篇文章:stackoverflow.com/questions/3736210/…
-
我是说你不需要命令。
-
实际上它不仅读取文件中的参数,当我需要获取内存百分比,CPU温度时也需要一些命令,所以我使用
popen() -
C 是一种编程语言,可用于读取文件和执行计算。如果您要严重依赖其他命令,不妨编写一个 bash 脚本。