【问题标题】:Issue when opening a system file Linux in for loop在 for 循环中打开系统文件 Linux 时出现问题
【发布时间】: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
        }
    }
}

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

【问题讨论】:

  • 为什么要使用popen调用命令读取文件?只需直接打开文件并阅读即可。
  • 因为我需要 shell 命令的返回值。我参考这篇文章:stackoverflow.com/questions/3736210/…
  • 我是说你不需要命令。
  • 实际上它不仅读取文件中的参数,当我需要获取内存百分比,CPU温度时也需要一些命令,所以我使用popen()
  • C 是一种编程语言,可用于读取文件和执行计算。如果您要严重依赖其他命令,不妨编写一个 bash 脚本。

标签: c linux file system


【解决方案1】:
    return value;
    pclose(fp);

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

如果您正确地pclose,您可以拨打popen 的次数没有限制。

【讨论】:

  • 感谢您的帮助,我已修复它。我正在使用这个程序来监控我的电脑,它将长时间 24/24 运行。如果我通过这样的命令获得 RAM、CPU 百分比,是否有任何潜在问题?我看到 C 中有一些库支持获取像 sys/sysinfo.h 这样的系统参数,但我不确定哪种方式对于 24/24 运行的计算机更稳定。
  • @ThanhNguyen:我不知道您所说的“更稳定”是什么意思,而且我真的无法分析您的代码是否存在所有可能的错误。如果此代码有效,它将无限期地继续工作。大概尽管您希望在循环中的某个位置使用sleep(),否则您的 CPU 使用率将是 100%,因为仅此程序。
  • @ThanhNguyen:请注意,每次调用grepawk 肯定不如通过直接在C 程序中读取和解析/proc/stat 来获取值(例如使用fscanf) ,因此也浪费了一些 CPU 时间。这是否重要,以及这种效率是否值得花时间编写更多代码,只有您可以决定。
猜你喜欢
  • 2020-03-15
  • 1970-01-01
  • 2020-03-10
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
  • 2019-06-27
相关资源
最近更新 更多