简体   繁体   中英

Issue when opening a system file Linux in for loop

I am trying to create a program monitor system parameter like: CPU usage percent, Ram usage percent and send a warning log when the percent is over 80%. My solution when reading CPU percent is using mpstat or cat the /proc/stat like this:

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

And the issue is when i run program after a few minutes i will can not open the file, the pointer fp is NULL . I guest that Linux prevent a program open a file too many times or maybe can not run a bash command too many times. Can you help me explain why ? and a solution for this case.

    return value;
    pclose(fp);

and so pclose(fp) is never called. Thus you leak resources ( FILE stream, file descriptor, child process, etc) on every call, and eventually you run out so popen fails.

If you pclose properly there is no limit on how many times you can call popen .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM