linux代码获取某个进程的cpu、内存

27 篇文章 0 订阅
struct CPUSnapShot
{
    CPUSnapShot()
    {
        char buff[256] = {0};                                                                                                                
        FILE * fd = fopen("/proc/stat", "r"); 
        fgets(buff, sizeof(buff), fd);
        
        fclose(fd);
        
        sscanf(buff, "%s %u %u %u %u %u %u %u %u %u", name, 
            &user, &nice, &system, &idle, 
            &iowait, &irq, &softirq, &stealstolen, 
            &guest);
            
    }

    unsigned int Total()
    {
        return user +
            nice +
            system +
            idle +
            iowait +
            irq +
            softirq +
            stealstolen +
            guest;
    }
    
    char name[256];
    unsigned int user;
    unsigned int nice;
    unsigned int system;
    unsigned int idle;
    unsigned int iowait;
    unsigned int irq;
    unsigned int softirq;
    unsigned int stealstolen;
    unsigned int guest;
};

struct ProcCPUSnapShot
{
    ProcCPUSnapShot()
    {
        char strLinkFile[1024];
		SPRINTF_SAFE(strLinkFile, "/proc/%d/stat", getpid());

        char buff[256] = {0};                                                                                                                
        FILE * fd = fopen(strLinkFile, "r"); 
        fgets(buff, sizeof(buff), fd);

        fclose(fd);

        char * tokenPtr = strtok(buff, " ");
        int i = 0;
        while (tokenPtr != NULL && i < 12)
        {
            tokenPtr = strtok(NULL, " ");
            i++;
        }
        
        SAFE_TEST_RET(tokenPtr, NULL);

        tokenPtr = strtok(NULL, " ");
        SAFE_TEST_RET(tokenPtr, NULL);
        utime = atoi(tokenPtr);
        
        tokenPtr = strtok(NULL, " ");
        SAFE_TEST_RET(tokenPtr, NULL);
        stime = atoi(tokenPtr);
       
        tokenPtr = strtok(NULL, " ");
        SAFE_TEST_RET(tokenPtr, NULL);
        cutime = atoi(tokenPtr);
        
        tokenPtr = strtok(NULL, " ");
        SAFE_TEST_RET(tokenPtr, NULL);
        cstime = atoi(tokenPtr);
        
    }
    
    unsigned int Total()
    {
        return utime + 
            stime + 
            cutime + 
            cstime;
    }
    
    unsigned int utime;
    unsigned int stime;
    unsigned int cutime;
    unsigned int cstime;
};

int GetCPUUseage(uint32_t & totalUse, uint32_t & curProcUse)
{
    static CPUSnapShot last;
    static ProcCPUSnapShot lastProc;

    CPUSnapShot cur;
    ProcCPUSnapShot curProc;

    totalUse = cur.Total() == last.Total() ? 0 : ((cur.Total() - last.Total()) - (cur.idle - last.idle)) * 10000 / (cur.Total() - last.Total());
    curProcUse = cur.Total() == last.Total() ? 0 : (curProc.Total() - lastProc.Total()) * 10000 / (cur.Total() - last.Total());

    last = cur;
    lastProc = curProc;
    
    return 0;
}

int GetLoadAvg(uint32_t & loadavg)
{
    char buff[256] = {0};                                                                                                                
    FILE * fd = fopen("/proc/loadavg", "r"); 
    fgets(buff, sizeof(buff), fd);
    
    fclose(fd);

    float floadavg = 0.f;
    sscanf(buff, "%f", &floadavg);

    loadavg = uint32_t(floadavg * 100);
    
    return 0;
}

int GetMemUseage(uint32_t & res, uint32_t & virt)
{
    char strLinkFile[1024];
	SPRINTF_SAFE(strLinkFile, "/proc/%d/status", getpid());

    char buff[1024] = {0};                                                                                                                
    FILE * fd = fopen(strLinkFile, "r"); 
    fread(buff, sizeof(buff), 1, fd);
    
    fclose(fd);

    char tmp1[256] = {0};  
    char tmp2[256] = {0};  
    
    char * p = NULL;
    p = strstr(buff, "VmSize");
    SAFE_TEST_RET_VAL(p, NULL, false);
    sscanf(p, "%s %u %s", tmp1, &virt, tmp2);

    p = strstr(buff, "VmRSS");
    SAFE_TEST_RET_VAL(p, NULL, false);
    sscanf(p, "%s %u %s", tmp1, &res, tmp2);

    res /= 1024;
    virt /= 1024;
    
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值