-
(float)getCpuUsage:(unsigned int)pid
{
kern_return_t kr;
thread_array_t thread_list;
mach_msg_type_number_t thread_count;
thread_info_data_t thinfo;
mach_msg_type_number_t thread_info_count;
thread_basic_info_t basic_info_th;mach_port_name_t task;
int error = task_for_pid(mach_task_self(), pid, &task);
if (error)
{
printf(“task_for_pid return error:\n %s\n”, mach_error_string(error));
} else {
printf(“Get the process %d’s task port : %x\n”, pid, task);
}kr = task_threads(task, &thread_list, &thread_count);
if (kr != KERN_SUCCESS) {
return -1;
}
float cpu_usage = 0;for (int i = 0; i < thread_count; i++)
{
thread_info_count = THREAD_INFO_MAX;
kr = thread_info(thread_list[i], THREAD_BASIC_INFO,(thread_info_t)thinfo, &thread_info_count);
if (kr != KERN_SUCCESS) {
return -1;
}basic_info_th = (thread_basic_info_t)thinfo; if (!(basic_info_th->flags & TH_FLAGS_IDLE)) { cpu_usage += basic_info_th->cpu_usage; }
}
cpu_usage = cpu_usage / (float)TH_USAGE_SCALE * 100.0;vm_deallocate((mach_port_t)pid, (vm_offset_t)thread_list, thread_count * sizeof(thread_t));
return cpu_usage;
}
获取子进程的CPU使用率需要在子进程中运行上面程序,然后通过IPC获得