#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