2012-10-15 4 views
6

क्या sysctl() का उपयोग कर प्रत्येक प्रक्रिया के लिए सीपीयू उपयोग प्राप्त करने का कोई तरीका है?sysctl() का उपयोग कर प्रत्येक प्रक्रिया के लिए आईओएस सीपीयू उपयोग?

मैं एक विशिष्ट एप्लिकेशन के लॉन्च का पता लगाने के लिए एक रास्ता खोजने की कोशिश कर रहा हूं। ऐसा लगता है कि अग्रभूमि चल रही ऐप जानकारी प्राप्त करने का कोई तरीका नहीं है। तो मुझे लगता है कि अगर मैं उस विशिष्ट ऐप के लिए सीपीयू उपयोग की निगरानी कर सकता हूं तो मैं सीपीयू उपयोग में बदलावों की निगरानी कर सकता हूं और ऐप लॉन्च होने पर लगभग अनुमान लगा सकता हूं। क्या यह वास्तव में संभव है?

मैं इस ऐप को सेब ऐपस्टोर में प्रकाशित करने की योजना नहीं बना रहा हूं।

यह केवल एक शोध है। तो अगर ऐसा करने का कोई तरीका है तो मुझे जानकर खुशी हो रही है।

+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. ivars

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

3.IN मीटर फ़ाइल

-(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

हाय अंकित, उत्तर के लिए बहुत बहुत धन्यवाद। लेकिन मैं अभी भी प्रक्रिया आईडी द्वारा सीपीयू उपयोग प्राप्त करने का एक तरीका नहीं समझ सका। यदि आपके पास नमूना कोड स्निपेट है तो यह बेहद सहायक होगा। धन्यवाद! – sleepwalkerfx

+0

संपादित कोड के साथ उत्तर में किया गया है ... – Ankit

+1

हाय उत्तर के लिए बहुत बहुत धन्यवाद। हालांकि, क्या यह कोड प्रत्येक प्रक्रिया के लिए सीपीयू उपयोग लॉग करता है? मैं अपने पीआईडी ​​को एक समारोह में पास करके 'यूट्यूब' आवेदकॉन या 'कैमरा' एप्लिकेशन के लिए सीपीयू उपयोग जानना चाहता हूं। यदि आप मुझे एक सुराग दे सकते हैं तो इसकी अत्यधिक सराहना की जाती है। – sleepwalkerfx

संबंधित मुद्दे