• Linux c读取系统内存使用信息


    系统的内存使用信息能够在虚拟文件系统/proc/meminfo中找到,如图

    所以只要打开/proc/meminfo文件,然后从中读取信息就好了

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <fcntl.h>
    #define MEM_PART "/proc/meminfo"


    //用于存储内存信息的结构体
    struct mem_info
    {
        char MemTotal[20];
        char MemFree[20];
        char MemAvailable[20];
        char Buffers[20];
        char Cached[20];
    };

    typedef struct mem_info MEM_info,*pMEM_info;

    //打开fileName指定的文件,从中读取第lineNumber行
    //返回值:成功返回1,失败返回0
    int get_file_line(char *result,char *fileName,int lineNumber)
    {
        FILE *filePointer;
        int i=0;
        char buffer[FILEBUFFER_LENGTH];

        if((fileName==NULL)||(result==NULL))
        {
            return 0;
        }

        if(!(filePointer=fopen(fileName,"rb")))
        {return 0;}


        while((!feof(filePointer))&&(i<lineNumber))
        {
            if(!fgets(buffer,FILEBUFFER_LENGTH,filePointer))
            {
                return 0;
            }
            i++;//差点又忘记加这一句了
        }

       /* printf(" %d ",sizeof(*result));
        if(strlen(buffer)>sizeof(*result))//不能够这么写,虽然fgets读取一行后会在末尾加上'',但是sizeof(result)得到的结果却是result本身类型的大小,所以不能够这么算。当静态数组传入函数时,在函数内部只能知道它是一个指针
        {
            return 0;
        }*/

        strcpy(result,buffer);

        if(0!=fclose(filePointer))
        {
            return 0;
        }

        return 1;
    }



    //按行读取/proc/meminfo中的信息,并保存到mem结构体中
    int get_mem_info(pMEM_info mem)
    {
        char buffer[300];
        if(NULL==mem)
        {
            printf(" get_mem_info:param null! ");
            return 0;
        }
        memset(mem,0,sizeof(MEM_info));
        if(1==get_file_line(buffer,MEM_PART,1))//读取第一行
        {
            sscanf(buffer,"%*s %s",mem->MemTotal);
            if(1==get_file_line(buffer,MEM_PART,2))//读取第二行
            {   sscanf(buffer,"%*s %s",mem->MemFree);
                if(1==get_file_line(buffer,MEM_PART,3))//读取第三行
                {   sscanf(buffer,"%*s %s",mem->MemAvailable);
                    if(1==get_file_line(buffer,MEM_PART,4))//读取第四行
                        {   sscanf(buffer,"%*s %s",mem->Buffers);
                            if(1==get_file_line(buffer,MEM_PART,5))//读取第五行
                                {
                                    sscanf(buffer,"%*s %s",mem->Cached);
                                    return 1;
                                }

                        }

                }

            }

        }

        return 0;
    }


    int main()
    {
       
        MEM_info mem;

        get_mem_info(&mem);
        printf(" %s %s %s %s %s ",mem.MemTotal,mem.MemFree,mem.MemAvailable,mem.Buffers,mem.Cached);

        return 1;

    }

  • 相关阅读:
    re模块
    Docker的使用
    flask中请求勾子
    flask中的蓝图实现模块化的应用
    HTTP中常见的各种状态码详解及解决方案
    git快速入门
    2st week blog 1
    web个人介绍
    CentOS7下shell脚本实现限定范围类的随机数
    CentOS7下shell脚本大小比较
  • 原文地址:https://www.cnblogs.com/thegodofthunder/p/7216923.html
Copyright © 2020-2023  润新知