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

问题是当我 运行 程序几分钟后我将无法打开文件,指针 fpNULL。我想 Linux 防止程序打开文件太多次,或者可能不能 运行 一个 bash 命令太多次。你能帮我解释一下为什么吗?以及这种情况的解决方案。

    return value;
    pclose(fp);

所以 pclose(fp) 永远不会被调用。因此,您在每次调用时都会泄漏资源(FILE 流、文件描述符、子进程等),最终您会 运行 失败,因此 popen 失败。

如果你 pclose 正确,你可以调用 popen 的次数没有限制。