在 for 循环中打开系统文件 Linux 时出现问题
Issue when opening a system file Linux in for loop
我正在尝试创建一个程序监控系统参数,例如:CPU 使用百分比、Ram 使用百分比,并在百分比超过 80% 时发送警告日志。我在读取 CPU 百分比时的解决方案是使用 mpstat
或像这样对 /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 ' ~ /[0-9.]+/ { print 100 - "" }'"); // using mpstat
cpu_percent = get_system_value("grep 'cpu ' /proc/stat | awk '{usage=(+)*100/(++)} 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 命令太多次。你能帮我解释一下为什么吗?以及这种情况的解决方案。
return value;
pclose(fp);
所以 pclose(fp)
永远不会被调用。因此,您在每次调用时都会泄漏资源(FILE
流、文件描述符、子进程等),最终您会 运行 失败,因此 popen
失败。
如果你 pclose
正确,你可以调用 popen
的次数没有限制。
我正在尝试创建一个程序监控系统参数,例如:CPU 使用百分比、Ram 使用百分比,并在百分比超过 80% 时发送警告日志。我在读取 CPU 百分比时的解决方案是使用 mpstat
或像这样对 /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 ' ~ /[0-9.]+/ { print 100 - "" }'"); // using mpstat
cpu_percent = get_system_value("grep 'cpu ' /proc/stat | awk '{usage=(+)*100/(++)} 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 命令太多次。你能帮我解释一下为什么吗?以及这种情况的解决方案。
return value;
pclose(fp);
所以 pclose(fp)
永远不会被调用。因此,您在每次调用时都会泄漏资源(FILE
流、文件描述符、子进程等),最终您会 运行 失败,因此 popen
失败。
如果你 pclose
正确,你可以调用 popen
的次数没有限制。