Objective c 使用sysctl()的每个进程的iOS cpu使用率?
是否有办法使用sysctl()获取每个进程的cpu使用率? 我试图找到一种方法来检测特定应用程序的启动。似乎没有办法获取前台运行的应用程序信息。因此,我想如果我可以监控特定应用程序的cpu使用情况,我可以监控cpu使用情况的变化,并大致假设应用程序何时启动。这可能吗 我不打算将此应用发布到苹果应用商店。Objective c 使用sysctl()的每个进程的iOS cpu使用率?,objective-c,ios,sysctl,Objective C,Ios,Sysctl,是否有办法使用sysctl()获取每个进程的cpu使用率? 我试图找到一种方法来检测特定应用程序的启动。似乎没有办法获取前台运行的应用程序信息。因此,我想如果我可以监控特定应用程序的cpu使用情况,我可以监控cpu使用情况的变化,并大致假设应用程序何时启动。这可能吗 我不打算将此应用发布到苹果应用商店。 这只是一项研究。因此,如果有任何方法可以做到这一点,我很高兴知道。请完成以下过程1。导入以下文件 #include <sys/sysctl.h> #include <sys/t
这只是一项研究。因此,如果有任何方法可以做到这一点,我很高兴知道。请完成以下过程1。导入以下文件
#include <sys/sysctl.h>
#include <sys/types.h>
#include <mach/mach.h>
#include <mach/processor_info.h>
#include <mach/mach_host.h>
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];
}
-(void)voidDidLoad
{
int-mib[2U]={CTL_-HW,HW_-NCPU};
size\u t sizeOfNumCPUs=sizeof(numpus);
int status=sysctl(mib,2U,&numpus,&sizeofnumcpu,NULL,0U);
如果(状态)
numpus=1;
CPUUsageLock=[[NSLock alloc]init];
updateTimer=[[NSTimer scheduledTimerWithTimeInterval:3
目标:自我
选择器:@selector(更新信息:)
用户信息:无
重复:是]保留];
}
-(void)updateInfo:(NSTimer*)计时器
{
自然数=0U;
kern\u return\u t err=host\u processor\u info(mach\u host\u self()、processor\u CPU\u LOAD\u info、&numpusu、&cpuInfo、&numpunfo);
if(err==KERN_SUCCESS){
[CPUUSAGE lock];
用于(无符号i=0U;i
}我贴出了答案。这对你有帮助吗?嗨,安基特,非常感谢你的回答。但我仍然无法找到一种通过进程id获取cpu使用率的方法。如果您有一个示例代码段,它将非常有用。非常感谢。嗨,非常感谢你的回答。但是,此代码是否记录每个进程的cpu使用情况?我想通过将PID传递给函数来了解“Youtube”应用程序或“Camera”应用程序的cpu使用情况。如果你能给我一个线索,我将不胜感激。谢谢你的回答。如何获得总空闲cpu时间?(并非针对每个流程)。
-(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];
}