| cpuusage.cpp - c++ code for Mac OSX to calculate average CPU usage during several seconds, specified in argument. Compilation: g++ -o cpuusage cpuusage.cpp Excute from terminal: ./cpuusage <argument - number of seconds to calculate average CPU usage, integer> For example: cpuusage 5 |
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <mach/mach.h>
int getCpuInfo(unsigned long * pulSystem, unsigned long * pulUser, unsigned long * pulNice, unsigned long * pulIdle);
int main(int nn, char ** args)
{
if(nn<2)
{
printf("Please specify waiting time in seconds\n");
return -1;
}
int nWaitSec = atoi(args[1]);
if(nWaitSec<=0)
{
printf("Waiting interval in seconds should be positive integer\n");
return -1;
}
unsigned long ulSystemPrevious;
unsigned long ulUserPrevious;
unsigned long ulNicePrevious;
unsigned long ulIdlePrevious;
int nErr = getCpuInfo(&ulSystemPrevious, &ulUserPrevious, &ulNicePrevious, &ulIdlePrevious);
if(nErr != KERN_SUCCESS)
{
printf("Kernel error: %s\n", mach_error_string(nErr));
return -1;
}
printf("Waiting for %d seconds\n", nWaitSec);
sleep(nWaitSec);
unsigned long ulSystemNext;
unsigned long ulUserNext;
unsigned long ulNiceNext;
unsigned long ulIdleNext;
nErr = getCpuInfo(&ulSystemNext, &ulUserNext, &ulNiceNext, &ulIdleNext);
if(nErr != KERN_SUCCESS)
{
printf("Kernel error: %s\n", mach_error_string(nErr));
return -1;
}
float fUsageTime = (float)(ulSystemNext - ulSystemPrevious) + (ulUserNext - ulUserPrevious) + (ulNiceNext - ulNicePrevious);
float fTotalTime = fUsageTime + (float)(ulIdleNext - ulIdlePrevious);
printf("Average CPU during last %d seconds is %f%%\n", nWaitSec, fUsageTime/fTotalTime*100);
return 0;
}
int getCpuInfo(unsigned long * pulSystem, unsigned long * pulUser, unsigned long * pulNice, unsigned long * pulIdle)
{
mach_msg_type_number_t unCpuMsgCount = 0;
processor_flavor_t nCpuFlavor = PROCESSOR_CPU_LOAD_INFO;;
kern_return_t nErr = 0;
natural_t unCPUNum = 0;
processor_cpu_load_info_t structCpuData;
host_t host = mach_host_self();
*pulSystem = 0;
*pulUser = 0;
*pulNice = 0;
*pulIdle = 0;
nErr = host_processor_info( host,nCpuFlavor,&unCPUNum,
(processor_info_array_t *)&structCpuData,&unCpuMsgCount );
for(int i = 0; i<(int)unCPUNum; i++)
{
*pulSystem += structCpuData[i].cpu_ticks[CPU_STATE_SYSTEM];
*pulUser += structCpuData[i].cpu_ticks[CPU_STATE_USER];
*pulNice += structCpuData[i].cpu_ticks[CPU_STATE_NICE];
*pulIdle += structCpuData[i].cpu_ticks[CPU_STATE_IDLE];
}
return nErr;
}