Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS cpu usage for each process using sysctl()?

Is there a way to get cpu usage for each process using sysctl() ?

I'm trying to find a way to detect the launch of a specific application. It seems there's no way to get foreground running app information. So I guess if I can monitor cpu usage for that specific app I can monitor the cpu usage changes and roughly assume when the app launches. Is this possible at all?

I'm not planning to publish this app to apple appstore.

This is only a research. So if there is ANY way to do this I'm glad to know.

like image 691
Rukshan Avatar asked Oct 15 '12 04:10

Rukshan


1 Answers

Go through the following process 1. Import Following Files

#include <sys/sysctl.h>
#include <sys/types.h>
#include <mach/mach.h>
#include <mach/processor_info.h>
#include <mach/mach_host.h>

2. Add ivars

processor_info_array_t cpuInfo, prevCpuInfo;
mach_msg_type_number_t numCpuInfo, numPrevCpuInfo;
unsigned numCPUs;
NSTimer *updateTimer;
NSLock *CPUUsageLock;

3.IN .m file

-(void)voidDidLoad
{
int mib[2U] = { CTL_HW, HW_NCPU };
size_t sizeOfNumCPUs = sizeof(numCPUs);
int status = sysctl(mib, 2U, &numCPUs, &sizeOfNumCPUs, NULL, 0U);
if(status)
    numCPUs = 1;

CPUUsageLock = [[NSLock alloc] init];

updateTimer = [[NSTimer scheduledTimerWithTimeInterval:3
                                                target:self
                                              selector:@selector(updateInfo:)
                                              userInfo:nil
                                               repeats:YES] retain];    
}
- (void)updateInfo:(NSTimer *)timer
{
natural_t numCPUsU = 0U;
kern_return_t err = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &numCPUsU, &cpuInfo, &numCpuInfo);
if(err == KERN_SUCCESS) {
    [CPUUsageLock lock];

    for(unsigned i = 0U; i < numCPUs; ++i) {
        float inUse, total;
        if(prevCpuInfo) {
            inUse = (
                     (cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER]   - prevCpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER])
                     + (cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] - prevCpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM])
                     + (cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE]   - prevCpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE])
                     );
            total = inUse + (cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE] - prevCpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE]);
        } else {
            inUse = cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER] + cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] + cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE];
            total = inUse + cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE];
        }

        NSLog(@"Core: %u Usage: %f",i,inUse / total);
    }
    [CPUUsageLock unlock];

    if(prevCpuInfo) {
        size_t prevCpuInfoSize = sizeof(integer_t) * numPrevCpuInfo;
        vm_deallocate(mach_task_self(), (vm_address_t)prevCpuInfo, prevCpuInfoSize);
    }

    prevCpuInfo = cpuInfo;
    numPrevCpuInfo = numCpuInfo;

    cpuInfo = NULL;
    numCpuInfo = 0U;
} else {
    NSLog(@"Error!");
    [NSApp terminate:nil];
}

}

like image 178
Ankit Avatar answered Oct 19 '22 18:10

Ankit