/** * procmonAIX * * Tool to monitor a running process and its threads without any changes to the * executable. Gives statistics much more detailed that what the ps command can. * * Compile: make procmonAIX * * Usage: * procmonAIX [pid] [numprocs] * pid: optional pid to start with (default is 0) * numprocs: optional number of processes to monitor starting from * this pid (default is 1) * * File: procmonAIX.c * Author: Tanmay K. Mohapatra * HTTP: http://tanmaykm.webjump.com/ * http://tanmaykm.tripod.com/ * */ #include #include #include #include #include #include int printProcInfo(struct procsinfo *pInfo); int printThrdInfo(struct thrdsinfo *pInfo); int main(int argc, char **argv) { int iNumProcs; struct procsinfo stProcessBuffer; int iProcessSize; struct fdsinfo stFdsInfo; int iFdsInfoSize; pid_t IndexPointer; int iNumProcsToShow; iProcessSize = sizeof(struct procsinfo); iFdsInfoSize = sizeof(struct fdsinfo); IndexPointer = (argc > 1) ? atoi(argv[1]) : 0; iNumProcsToShow = (argc > 2) ? atoi(argv[2]) : 1; while(iNumProcsToShow > 0) { iNumProcs = getprocs(&stProcessBuffer, iProcessSize, &stFdsInfo, iFdsInfoSize, &IndexPointer, 1); if (iNumProcs > 0) { printProcInfo(&stProcessBuffer); if (stProcessBuffer.pi_thcount > 0) { int iNumThrds = stProcessBuffer.pi_thcount; struct thrdsinfo stThreadBuffer; tid_t iThrdIndxPtr = 0; int iCount, iRetVal; while(iNumThrds > 0) { iRetVal = getthrds(stProcessBuffer.pi_pid, &stThreadBuffer, sizeof(struct thrdsinfo), &iThrdIndxPtr, 1); if (iRetVal > 0) { printf("...........\n"); printThrdInfo(&stThreadBuffer); } iNumThrds--; } } printf("-------------------------------\n"); } else { printf("Error %d\n", errno); } iNumProcsToShow--; } return 0; } int printThrdInfo(struct thrdsinfo *pInfo) { printf("pid, thread id = %d, %d\n", pInfo->ti_pid, pInfo->ti_tid); printf("processor bound to = %d\n", pInfo->ti_cpuid); printf("processor usage = %d\n", pInfo->ti_cpu); return 0; } int printProcInfo(struct procsinfo *pInfo) { printf("command = %s\n", pInfo->pi_comm); printf("pid,ppid,uid = %d, %d, %d\n", pInfo->pi_pid, pInfo->pi_ppid, pInfo->pi_uid); /* printf("sid = %d\n", pInfo->pi_sid); printf("pgrp = %d\n", pInfo->pi_pgrp); printf("suid = %d\n", pInfo->pi_suid); printf("nice = %d\n", pInfo->pi_nice); printf("state = %d\n", pInfo->pi_state); printf("flags = %d\n", pInfo->pi_flags); */ printf("thread count = %d\n", pInfo->pi_thcount); printf("address space = %d\n", pInfo->pi_adspace); printf("page faults io,non io= %d, %d\n", pInfo->pi_majflt, pInfo->pi_minflt); printf("repaging count = %d\n", pInfo->pi_repage); printf("size of image (pages) = %d\n", pInfo->pi_size); printf("process user,system time = %d.%.3d, %d.%.3d\n", pInfo->pi_ru.ru_utime.tv_sec, pInfo->pi_ru.ru_utime.tv_usec/1000000, pInfo->pi_ru.ru_stime.tv_sec, pInfo->pi_ru.ru_stime.tv_usec/1000000); printf("children user,system time = %d.%.3d, %d.%.3d\n", pInfo->pi_cru.ru_utime.tv_sec, pInfo->pi_cru.ru_utime.tv_usec/1000000, pInfo->pi_cru.ru_stime.tv_sec, pInfo->pi_cru.ru_stime.tv_usec/1000000); printf("size of text = %d\n", pInfo->pi_tsize); printf("resident set size data, text= %d, %d\n", pInfo->pi_drss, pInfo->pi_trss); printf("data virtual mem size = %d\n", pInfo->pi_dvm); printf("percent real mem usage = %d\n", pInfo->pi_prm); printf("max u_ofile index in use = %d\n", pInfo->pi_maxofile); return 0; }