Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用sysctl()的每个进程的iOS cpu使用率?_Objective C_Ios_Sysctl - Fatal编程技术网

Objective c 使用sysctl()的每个进程的iOS 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

是否有办法使用sysctl()获取每个进程的cpu使用率?

我试图找到一种方法来检测特定应用程序的启动。似乎没有办法获取前台运行的应用程序信息。因此,我想如果我可以监控特定应用程序的cpu使用情况,我可以监控cpu使用情况的变化,并大致假设应用程序何时启动。这可能吗

我不打算将此应用发布到苹果应用商店。


这只是一项研究。因此,如果有任何方法可以做到这一点,我很高兴知道。

请完成以下过程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];
}