您的位置:首页 > 其它

求内存利用情况

2016-03-17 15:09 337 查看
getMem.h

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <elatypes.h>

#include <stdarg.h>

#include <sys/time.h>

#include <sys/stat.h>

#include <unistd.h>

#ifdef _MSVC

#include <io.h>

#include <direct.h>

#endif

enum Status_Type {

    Status_Type_VmHWM = 1, //占用的物理内存最大值

    Status_Type_VmRSS = 2, //当前占用的物理内存值

    Status_Type_Thread = 4,//线程数

    Status_Type_File = 8,//文件数

    Status_Type_ALL = 15

};

typedef struct {

    int HWM;

    int RSS;

    int Threads;

    int Files;
} Status_Info;

int getMemoryInfo(Status_Type type, const char *procName, Status_Info *pResult = NULL);

getMen.cpp

int getMemoryInfoById(Status_Type type, int procId, Status_Info *pResult)

{

#ifdef _linux

    Boolean bVmHWM = false;

    Boolean bVmRSS = false;

    Boolean bThread = false;

    if (type & Status_Type_VmHWM) bVmHWM = true;

    if (type & Status_Type_VmRSS) bVmRSS = true;

    if (type & Status_Type_Thread) bThread = true;

    char szFileName[256];

    snprintf(szFileName, 256, "/proc/%d/status", procId);

    FILE *fp = NULL;

    fp = fopen(szFileName, "r");

    if (NULL == fp) {

        printf("Failed to fopen %s\n", szFileName);

        return -1;

    }

    printf("Proc :%d\n", procId);

    char szLine[260];

    int id = -1;

    for (;;) {

        if (NULL != fgets(szLine, 260, fp)) {

            if (bVmHWM && strstr(szLine, "VmHWM:")) {

                char *p = strchr(szLine, ' ');

                id = atoi(p);

                printf("VmHWM = %d\n", id);

                bVmHWM = false;

                if (pResult) {

                    pResult->HWM += id;

                }

                continue;

            }

            if (bVmRSS && strstr(szLine, "VmRSS:")) {

                char *p = strchr(szLine, ' ');

                id = atoi(p);

                printf("VmRSS = %d\n", id);

                bVmRSS = false;

                if (pResult) {

                    pResult->RSS += id;

                }

                continue;

            }

            if (bThread && strstr(szLine, "Threads:")) {

                char *p = strchr(szLine, '\t');

                id = atoi(p);

                printf("Threads = %d\n", id);

                bThread = false;

                if (pResult) {

                    pResult->Threads += id;

                }

                continue;

            }

        }

        else break;

    }

    fclose(fp);

    pResult->Files += getOpenFileCount(procId);

    return id;

#else

    return 0;

#endif

}

int getMemoryInfo(Status_Type type, const char *procName, Status_Info *pResult)

{

#ifdef _linux

    int procId[20] = {0};

    find_pid_by_name(procName, procId);

    memset(pResult, 0, sizeof(Status_Info));

    for (int i = 0; procId[i] != 0; i++) {

        getMemoryInfoById(type, procId[i], pResult);

    }

    XLOG(1, "----------Total-----------\n");

    XLOG(1, "VmHWM = %d\n", pResult->HWM);

    XLOG(1, "VmRSS = %d\n", pResult->RSS);

    XLOG(1, "Threads = %d\n", pResult->Threads);

    XLOG(1, "Openfiles = %d\n", pResult->Files);

#else

    pResult->HWM = 0;

    pResult->RSS = 0;

    pResult->Threads = 0;

    pResult->Files = 0;

#endif

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: