⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 performance.c

📁 获取unix系统进程信息的功能
💻 C
📖 第 1 页 / 共 2 页
字号:
    TotalDelta = TotalProcessCPUUsage - LastTotalProcessCPUUsage;
    *percent = 100*(float)cpuload/(float)TotalDelta;
    if (*percent > 100)
    {
        *percent = 100.00;
    }
    if (*percent < 0)
    {
        strcpy(errbuf, "2:get cpu load error");
        return -1;
    }

    free(pProcInfo);	
    return 0;
}

int GetProcMemUsage(unsigned int pid, float *percent, char *errbuf)
{
    LONG status;	
    void *pProcInfo = NULL;
    struct process_info *pProcessInfo;
    DWORD dwInfoSize = 0x80000;
    MEMORYSTATUS MemStat;
    DWORD phymem = 0, memtol;

    PROCNTQSI NtQuerySystemInformation;

    GlobalMemoryStatus(&MemStat); //dwTotalPhys
    memtol = MemStat.dwTotalPhys;

    pProcInfo = (void*)malloc(dwInfoSize);
    if(!pProcInfo)
    {
        strcpy(errbuf, "2:malloc() error");
        return -1;
    }

    NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(
        GetModuleHandle( "ntdll.dll" ),"NtQuerySystemInformation" );
    if (!NtQuerySystemInformation)
    {
        strcpy(errbuf, "2:GetProcAddress() error");
        free(pProcInfo);	
        return -1;
    } 
    status = NtQuerySystemInformation(5,pProcInfo,dwInfoSize,0);
    if (status!=NO_ERROR)
    {
        strcpy(errbuf, "2:NtQuerySystemInformation() error");
        free(pProcInfo);	
        return -1;
    }

    pProcessInfo = (struct process_info *)pProcInfo;
    while(1)
    {
        if(pid == pProcessInfo->dwProcessID)
        {
            phymem = pProcessInfo->dwWorkingSet;
        }
        if(pProcessInfo->dwOffset == 0)
        {
            break;
        }
        pProcessInfo = (struct process_info *)((byte*)pProcessInfo + pProcessInfo->dwOffset);
    }

    *percent = 100*(float)phymem/(float)memtol;

    if (*percent > 100)
    {
        *percent = 100.00;
    }
    if (*percent < 0)
    {
        strcpy(errbuf, "2:get memory load error");
        return -1;
    }

    free(pProcInfo);	
    return 0;
}

#else /** #ifdef WIN32 */

int GetSysCpuUsage(float *percent, char *errbuf)
{
    char buffer[MIN_BUF_LEN];
    unsigned long memsize = 0,memfree = 0;
    int ret;
    int i;

    //memset(buffer, 0, COM_BUF_LEN);
    //sprintf(buffer, "%s", "LANG=POSIX");
    //putenv(buffer);

    //fp=popen(SYSTEMSTATCMD,"r");
    //fgets(buffer,sizeof(buffer),fp);
    //pclose(fp);
    for (i = 0; i < 5; i++)
    {
        ret = my_system(SYSTEMSTATCMD, DEFAULT_COMMAND_TIMEOUT, buffer, MIN_BUF_LEN);
        if (ret != 0)
        {
            strcpy(errbuf, "2:my_system() error");
            return -1;
        }
        sscanf(buffer,"%d,%f",&memfree,percent);
        if (memfree != 0)
        {
            break;
        }
    }
    if (i >= 5)
    {
        strcpy(errbuf, "2:get cpu load error");
        return -1;
    }

    if (*percent > 100)
    {
        *percent = 100.00;
    }
    if (*percent < 0)
    {
        strcpy(errbuf, "2:get cpu load error");
        return -1;
    }
    return 0;
}

int GetSysMemUsage(float *percent, char *errbuf)
{
    char buffer[MIN_BUF_LEN];
    unsigned long memsize = 0,memfree = 0;
    float ftmp;
    int ret;
    int i;

    //memset(buffer, 0,sizeof(buffer));
    //sprintf(buffer, "%s", "LANG=POSIX");
    //putenv(buffer);

#if defined(SOLARIS) || defined(AIX)
    memset(buffer,0,sizeof(buffer));
    //fp=popen(SYSTEMSTATCMD,"r");
    //fgets(buffer,sizeof(buffer),fp);
    //pclose(fp);
    for (i = 0; i < 5; i++)
    {
        ret = my_system(SYSTEMSTATCMD, DEFAULT_COMMAND_TIMEOUT, buffer, MIN_BUF_LEN);
        if (ret != 0)
        {
            strcpy(errbuf, "2:my_system() error");
            return -1;
        }
        sscanf(buffer,"%d,%f",&memfree,&ftmp);
        if (memfree != 0)
        {
            break;
        }
    }
    if (i >= 5)
    {
        strcpy(errbuf, "2:get memory load error");
        return -1;
    }
    //fp=popen(MEMSIZECMD,"r");
    //fgets(buffer,sizeof(buffer),fp);
    //pclose(fp);
    ret = my_system(MEMSIZECMD, DEFAULT_COMMAND_TIMEOUT, buffer, MIN_BUF_LEN);
    if (ret != 0)
    {
        strcpy(errbuf, "2:my_system() error");
        return -1;
    }
    memsize = strtoul(buffer,NULL,10);

#elif defined(LINUX)
    //fp=popen(PHYSICAL_MEMORY_COMMAND,"r");
    //fgets(buffer,sizeof(buffer),fp);
    //pclose(fp);
    ret = my_system(PHYSICAL_MEMORY_COMMAND, DEFAULT_COMMAND_TIMEOUT, buffer, MIN_BUF_LEN);
    if (ret != 0)
    {
        strcpy(errbuf, "2:my_system() error");
        return -1;
    }
    sscanf(buffer,"%lu,%lu",&memsize,&memfree);
#endif

    if (memsize == 0)
    {
        strcpy(errbuf, "2:get memory size error");
        return -1;
    }

#ifdef AIX
    memfree *= 4;
#endif
    *percent = 100 - 100*((float)memfree/(float)memsize);
    if (*percent > 100)
    {
        *percent = 100.00;
    }
    if (*percent < 0)
    {
        strcpy(errbuf, "2:get memory load error");
        return -1;
    }

    return 0;
}

int GetSysMemSize(unsigned long *memsize, char *errbuf)
{
    char buffer[MIN_BUF_LEN];
    unsigned long memfree = 0;
    int ret;

    //memset(buffer, 0,sizeof(buffer));
    //sprintf(buffer, "%s", "LANG=POSIX");
    //putenv(buffer);

#if defined(SOLARIS) || defined(AIX)
    //fp=popen(MEMSIZECMD,"r");
    //fgets(buffer,sizeof(buffer),fp);
    //pclose(fp);
    ret = my_system(MEMSIZECMD, DEFAULT_COMMAND_TIMEOUT, buffer, MIN_BUF_LEN);
    if (ret != 0)
    {
        strcpy(errbuf, "2:my_system() error");
        return -1;
    }
    *memsize = strtoul(buffer,NULL,10);
#elif defined(LINUX)
    //fp=popen(PHYSICAL_MEMORY_COMMAND,"r");
    //fgets(buffer,sizeof(buffer),fp);
    //pclose(fp);
    ret = my_system(PHYSICAL_MEMORY_COMMAND, DEFAULT_COMMAND_TIMEOUT, buffer, MIN_BUF_LEN);
    if (ret != 0)
    {
        strcpy(errbuf, "2:my_system() error");
        return -1;
    }
    sscanf(buffer,"%lu,%lu",memsize,&memfree);
#endif

    if (*memsize <= 0)
    {
        strcpy(errbuf, "2:get memory size error");
        return -1;
    }

    return 0;
}

int GetProcCpuUsage(unsigned int pid, float *percent, char *errbuf)
{
    char szCmd[MIN_BUF_LEN];
    char szBuf[MIN_BUF_LEN];
    int ret;

#if defined(SOLARIS)   
    sprintf(szCmd,"ps -eo \"pid pcpu pmem rss args\" | awk 'BEGIN{pid=\"%d\";}NR>1{if(pid == $1)printf \"%%.02f\",$2;}'",pid);
#else  
    sprintf(szCmd,"ps auwwx | awk 'BEGIN{pid=\"%d\";}NR>1{if(pid == $2)printf \"%%.02f\",$3;}'", pid);
#endif

    ret = my_system(szCmd, DEFAULT_COMMAND_TIMEOUT, szBuf, MIN_BUF_LEN);
    if (ret != 0)
    {
        strcpy(errbuf, "2:my_system() error");
        return -1;
    }

    if(strlen(szBuf)>0)
    {
        *percent = atof(szBuf);
    }
    else
    {
        *percent = 0.00;
    }
    return 0;
}

int GetProcMemUsage(unsigned int pid, float *percent, char *errbuf)
{
    char szCmd[MIN_BUF_LEN];
    char szBuf[COM_BUF_LEN];
    int ret;

#if defined(SOLARIS)
    sprintf(szCmd,"ps -eo \"pid pcpu pmem rss args\" | awk 'BEGIN{pid=\"%d\";}NR>1{if(pid == $1)printf \"%%.02f\",$3;}'",pid);
#else
    sprintf(szCmd,"ps auwwx | awk 'BEGIN{pid=\"%d\";}NR>1{if(pid == $2)printf \"%%.02f\",$4;}'",pid);  
#endif

    ret = my_system(szCmd, DEFAULT_COMMAND_TIMEOUT, szBuf, MIN_BUF_LEN);
    if (ret != 0)
    {
        strcpy(errbuf, "2:my_system() error");
        return -1;
    }

    if(strlen(szBuf)>0)
    {
        *percent = atof(szBuf);
    }
    else
    {
        *percent = 0.00;
    }
    return 0;
}

#endif


#ifdef __cplusplus
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -