int main(int argc, char **argv) { kern_return_t kr; host_priv_t host_priv; processor_port_array_t processor_list; natural_t processor_count; char *errmsg = PROGNAME; if (argc != 2) { fprintf(stderr, "usage: %s <cmd>, where <cmd> is \"exit\" or \"start\"\n", PROGNAME); exit(1); } kr = host_get_host_priv_port(mach_host_self(), &host_priv); EXIT_ON_MACH_ERROR("host_get_host_priv_port:", kr); kr = host_processors(host_priv, &processor_list, &processor_count); EXIT_ON_MACH_ERROR("host_processors:", kr); // disable last processor on a multiprocessor system if (processor_count > 1) { if (*argv[1] == 'e') { kr = processor_exit(processor_list[processor_count - 1]); errmsg = "processor_exit:"; } else if (*argv[1] == 's') { kr = processor_start(processor_list[processor_count - 1]); errmsg = "processor_start:"; } else { kr = KERN_INVALID_ARGUMENT; } } else printf("Only one processor!\n"); // this will deallocate while rounding up to page size (void)vm_deallocate(mach_task_self(), (vm_address_t)processor_list, processor_count * sizeof(processor_t *)); EXIT_ON_MACH_ERROR(errmsg, kr); fprintf(stderr, "%s successful\n", errmsg); exit(0); }
/// Initialize Task Info Manager internal data. /// @return Upon successful completion 0 is returned. int task_info_manager_init(void) { static int completed = FALSE; if (completed == TRUE) { return 0; } kern_return_t kr; host_priv_t host_priv; processor_port_array_t processor_list; task_manager_port = mach_host_self(); kr = host_get_host_priv_port(task_manager_port, &host_priv); if (KERN_SUCCESS == kr) { host_processors(host_priv, &processor_list, &processor_count); } CFDictionaryKeyCallBacks tasksKeysCallBask = {0, NULL, NULL, NULL, KeysCompareFunc, KeysHashFunc}; CFDictionaryValueCallBacks tasksValueCallBask = {0, NULL, KeyFreeFunc, NULL, KeysCompareFunc}; tasks_dict = CFDictionaryCreateMutable(NULL, 0, &tasksKeysCallBask, &tasksValueCallBask); host_info_record.seq = 1; int mib[2] = {CTL_HW, HW_MEMSIZE}; size_t size; size = sizeof(host_info_record.memsize); if (sysctl(mib, 2, &host_info_record.memsize, &size, NULL, 0) == -1) { syslog(LOG_WARNING, "%s, Error in sysctl(): %m", __FUNCTION__); return -1; } gettimeofday(&host_info_record.time, NULL); man_info_init(); stack_info_init(); completed = TRUE; return 0; }
int main(void) { int i; kern_return_t kr; host_name_port_t myhost; host_priv_t host_priv; processor_port_array_t processor_list; natural_t processor_count; processor_basic_info_data_t basic_info; processor_cpu_load_info_data_t cpu_load_info; natural_t info_count; myhost = mach_host_self(); kr = host_get_host_priv_port(myhost, &host_priv); if (kr != KERN_SUCCESS) { mach_error("host_get_host_priv_port:", kr); exit(1); } processor_list = (processor_port_array_t)0; kr = host_processors(host_priv, &processor_list, &processor_count); if (kr != KERN_SUCCESS) { mach_error("host_processors:", kr); exit(1); } // #include <unistd.h> for getpid(2) and sleep(3) printf("processor_list = %p\n", processor_list); printf("my process ID is %d\n", getpid()); sleep(60); printf("%d processors total.\n", processor_count); for (i = 0; i < processor_count; i++) { info_count = PROCESSOR_BASIC_INFO_COUNT; kr = processor_info(processor_list[i], PROCESSOR_BASIC_INFO, &myhost, (processor_info_t)&basic_info, &info_count); if (kr == KERN_SUCCESS) print_basic_info((processor_basic_info_t)&basic_info); info_count = PROCESSOR_CPU_LOAD_INFO_COUNT; kr = processor_info(processor_list[i], PROCESSOR_CPU_LOAD_INFO, &myhost, (processor_info_t)&cpu_load_info, &info_count); if (kr == KERN_SUCCESS) print_cpu_load_info((processor_cpu_load_info_t)&cpu_load_info); } // Other processor information flavors (may be unsupported) // // PROCESSOR_PM_REGS_INFO, // performance monitor register information // PROCESSOR_TEMPERATURE, // core temperature // This will deallocate while rounding up to page size (void)vm_deallocate(mach_task_self(), (vm_address_t)processor_list, processor_count * sizeof(processor_t *)); exit(0); }