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;
}