• 取得进程信息


    #ifdef AIX
    INT32 CProcessState::GetProcessState(const INT64 lPid, TProState* pProcessState)
    {
        INT32 nRet = ZX_SYS_NO_ERROR;
        char cState = CHAR_SNONE;
        pid_t pid = lPid;
        INT32 nState = 0;
        INT64 lPageSize = 0;
        struct procsinfo pi;
        if (pProcessState == NULL)
        {
            ZX_ERROR(LOG_NORMAL,"pProcessState == NULL");
            return -1;
        }
        lPageSize = sysconf(_SC_PAGE_SIZE);
        if (lPageSize == -1)
        {
            ZX_ERROR(LOG_NORMAL,"sysconf(_SC_PAGE_SIZE)");
            return -1;
        }
    
        nRet = getprocs(&pi, sizeof(pi), 0, 0, &pid, 1);
        if(nRet != 1 || pi.pi_pid != lPid)
        {
            //ZX_ERROR(LOG_NORMAL,"getprocs()");
            return -1;
        }
        struct tm tmNow;
        time_t timeNow;
        time(&timeNow);
        perfstat_cpu_total_t userbuff;
        nRet = perfstat_cpu_total(NULL, &userbuff, sizeof(perfstat_cpu_total_t), 1);
        if (nRet != 1)
        {
            ZX_ERROR(LOG_NORMAL,"perfstat_cpu_total()");
            return -1;
        }
    
        nState = (INT32)pi.pi_state;
        switch (nState)
        {
        case SNONE:
        default:
            cState = CHAR_SNONE;
            break;
        case SIDL:
            cState = CHAR_SIDL;
            break;
        case SZOMB:
            cState = CHAR_SZOMB;
            break;
        case SSTOP:
            cState = CHAR_SSTOP;
            break;
        case SACTIVE:
            cState = CHAR_SACTIVE;
            break;
        case SSWAP:
            cState = CHAR_SSWAP;
            break;
        }
        /*打包进程信息*/
        sprintf(pProcessState->szProName,"%s",pi.pi_comm);    
        pProcessState->lPid = pi.pi_pid;
        pProcessState->dPercentCpu = (pi.pi_utime+pi.pi_stime)*100.0/(userbuff.ncpus_cfg*(timeNow-pi.pi_start));
        pProcessState->lMemUsage = pi.pi_size*lPageSize/SIZE_1K;
        pProcessState->lVMemUsage = pi.pi_size*lPageSize/SIZE_1K;
        pProcessState->nPriority = pi.pi_ppri;
        pProcessState->dPercentMem = pi.pi_prm;
        pProcessState->lRss = (pi.pi_drss+pi.pi_trss)*lPageSize/SIZE_1K;
        //CGetTime::TimeToString((time_t*)&pi.pi_start,pProcessState->szStart,"-",":");
        pProcessState->lTime = pi.pi_utime+pi.pi_stime;
        pProcessState->cStat = cState;
        return ZX_SYS_NO_ERROR;
    }
    #endif
    #ifdef HPUX
    INT32 CProcessState::GetProcessState(const INT64 lPid, TProState* pProcessState)
    {
        INT32 nRet = 0;
        char cState = CHAR_SNONE;
        pid_t pid = lPid;
        INT32 nState = 0;
        INT64 lPageSize = 0;
    
        struct pst_static pstatic;
        struct pst_status pi;
    
        if (pProcessState == NULL)
        {
            ZX_ERROR(LOG_NORMAL,"pProcessState == NULL");
            return -1;
        }
    
        nRet = pstat_getstatic(&pstatic, sizeof(pst_static), 1, 0);
        if (nRet == -1)
        {
            ZX_ERROR(LOG_NORMAL,"pstat_getstatic()");
            return -1;
        }
    
        nRet = pstat_getproc(&pi,sizeof(pst_status),0,pid);
            
        if (nRet!=-1 && pi.pst_pid == lPid)
        {
            nState = (INT32)pi.pst_stat;
            switch (nState)
            {
            case PS_OTHER:
            default:
                cState = CHAR_SNONE;
                break;
            case PS_IDLE:
                cState = CHAR_SIDL;
                break;
            case PS_ZOMBIE:
                cState = CHAR_SZOMB;
                break;
            case PS_STOP:
                cState = CHAR_SSTOP;
                break;
            case PS_RUN:
                cState = CHAR_SACTIVE;
                break;
            case PS_SLEEP:
                cState = CHAR_SSWAP;
                break;
            }
            /*打包消息*/
            sprintf(pProcessState->szProName,"%s",pi.pst_ucomm);    
            pProcessState->lPid = pi.pst_pid;
            pProcessState->dPercentCpu = pi.pst_pctcpu;
            pProcessState->lMemUsage = (pi.pst_dsize+pi.pst_ssize+pi.pst_tsize)*pstatic.page_size/SIZE_1K;
            pProcessState->lVMemUsage = (pi.pst_vssize+pi.pst_vtsize+pi.pst_vdsize)*pstatic.page_size/SIZE_1K;
            pProcessState->nPriority = pi.pst_pri;
            pProcessState->dPercentMem = pi.pst_rssize/(double)pstatic.pst_maxmem;
            pProcessState->lRss = pi.pst_rssize*pstatic.page_size/SIZE_1K;
            CGetTime::TimeToString(&(pi.pst_start),pProcessState->szStart,"-",":");
            pProcessState->lTime = pi.pst_utime+pi.pst_stime;
            pProcessState->cStat = cState;
        }
        else
        {
            ZX_ERROR(LOG_NORMAL,"pstat_getproc()");
            return -1;
        }
        return ZX_SYS_NO_ERROR;
    }
    #endif
    
    #ifdef LINUX
    INT32 CProcessState::GetProcessState(const INT64 lPid, TProState* pProcessState)
    {
        INT32 nRet = ZX_SYS_NO_ERROR;
        char szCommand[SIZE_1K] = "";
        char szTemp[SIZE_1K] = "";
        char szbuf[SIZE_1K] = "";
        char *pszTemp = NULL;
        char *pszSearch = " ";
        INT32 nPos = 0;
        FILE *fp = NULL;
        sprintf(szCommand,"ps -eo comm,pid,pcpu,pmem,size,vsize,rss,s,pri,cputime,lstart|grep %"PRId64 ,lPid);
        //TL_DEBUG("%s\n",szCommand);
        if (pProcessState == NULL)
        {
            ZX_ERROR(LOG_NORMAL,"pProcessState == NULL");
            return -1;
        }
        fp = popen(szCommand,"r");
        if (fp == NULL)
        {
            ZX_ERROR(LOG_NORMAL,szCommand);
            pszSearch = NULL;
            pszTemp = NULL;
            fp = NULL;
            return -1;
        }
        if(fgets(szbuf,sizeof(szbuf),fp))
        {
            pszTemp = strtok(szbuf,pszSearch);
            if(pszTemp != NULL)
            {
                sprintf(pProcessState->szProName,"%s",pszTemp);
            }
            for(int i = 0;i<10; i++)
            {
                if (i == 9)
                {
                    pszSearch = "\n";
                }
                pszTemp = strtok(NULL,pszSearch);
                if(pszTemp != NULL)
                {
                    switch (i)
                    {
                    case 0:
                        pProcessState->lPid = atol(pszTemp);
                        break;
                    case 1:
                        pProcessState->dPercentCpu = atof(pszTemp);
                        break;
                    case 2:
                        pProcessState->dPercentMem = atof(pszTemp);
                        break;
                    case 3:
                        pProcessState->lMemUsage = atol(pszTemp);
                        break;
                    case 4:
                        pProcessState->lVMemUsage = atol(pszTemp);
                        break;
                    case 5:
                        pProcessState->lRss = atol(pszTemp);
                        break;
                    case 6:
                        pProcessState->cStat = pszTemp[0];                    
                        break;
                    case 7:
                        pProcessState->nPriority = atoi(pszTemp);
                        break;
                    case 8:
                        pProcessState->lTime = 0;
                        break;
                    case 9:
                        sprintf(pProcessState->szStart,"%s",pszTemp);
                        break;
                    default:
                        break;
                    }
                }
            }        
        }
        pclose(fp);
        pszSearch = NULL;
        pszTemp = NULL;
        fp = NULL;
        return ZX_SYS_NO_ERROR;
    }
    #endif
  • 相关阅读:
    JS数组去重
    正则表达式验证邮箱手机号等
    js中的事件委托
    c++刷题(6/100)最长上升子序列
    c++刷题(3/100)数独,栈和队列
    在express中HMR(合并express和webpack-dev-server)
    面试整理(3)js事件委托
    面试整理(2)跨域:jsonp与CORS
    面试整理(1):原生ajax
    styled-components真的好吗?
  • 原文地址:https://www.cnblogs.com/hbt19860104/p/3096071.html
Copyright © 2020-2023  润新知