2012-10-15 56 views
6

有沒有辦法使用sysctl()獲得每個進程的CPU使用率?使用sysctl()的每個進程的iOS cpu使用情況?

我試圖找到一種方法來檢測特定應用程序的啓動。看起來沒有辦法讓前臺運行應用信息。所以我猜如果我可以監控特定應用的CPU使用情況,我可以監控CPU使用情況的變化,並大致假設應用何時啓動。這可能嗎?

我不打算髮布這個應用程序到蘋果appstore。

這只是一個研究。所以如果有任何方法可以做到這一點,我很高興知道。

+0

我張貼了一個答案。這對你有幫助嗎? – Ankit

回答

5

經過以下過程1.導入以下文件

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

2.添加高德

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

3.IN .m文件

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

}

+0

嗨Ankit,非常感謝你的答案。但我仍然無法找到通過進程ID獲取CPU使用情況的方法。如果你有一個示例代碼片段,這將是非常有用的。謝謝! – sleepwalkerfx

+0

編輯已經在代碼答案中作出了... – Ankit

+1

非常感謝你的回答。但是,此代碼是否記錄每個進程的CPU使用情況?我想通過將PID傳遞給一個函數來了解'Youtube'應用程序或'Camera'應用程序的CPU使用情況。如果你能給我一個線索,非常感謝。 – sleepwalkerfx

相關問題