/// Iterate all tasks and update/create their information. /// @return The call returns -1 on error, 0 indicate successful completion. static int read_tasks_table(void) { kern_return_t kr; processor_set_t pset; task_array_t tasks; processor_set_name_array_t psets; mach_msg_type_number_t i, j, pcnt, tcnt; kr = host_processor_sets(task_manager_port, &psets, &pcnt); if (kr != KERN_SUCCESS) { syslog(LOG_ERR, "error in host_processor_sets(): %s", mach_error_string(kr)); return -1; } for (i = 0; i < pcnt; i++) { kr = host_processor_set_priv(task_manager_port, psets[i], &pset); if (kr != KERN_SUCCESS) { syslog(LOG_ERR, "error in host_processor_set_priv(): %s", mach_error_string(kr)); return -1; } kr = processor_set_tasks(pset, &tasks, &tcnt); if (kr != KERN_SUCCESS) { syslog(LOG_ERR, "error in processor_set_tasks(): %s", mach_error_string(kr)); return -1; } for (j = 0; j < tcnt; j++) { read_task_info(tasks[j]); kr = mach_port_deallocate(mach_task_self(), tasks[j]); if (kr != KERN_SUCCESS) { syslog(LOG_WARNING, "%s, error in mach_port_deallocate(): %s", __FUNCTION__, mach_error_string(kr)); } } kr = vm_deallocate(mach_task_self(), (vm_address_t)tasks, tcnt * sizeof(processor_set_t)); kr = mach_port_deallocate(mach_task_self(), pset); kr = mach_port_deallocate(mach_task_self(), psets[i]); } kr = vm_deallocate(mach_task_self(), (vm_address_t)psets, pcnt * sizeof(processor_set_t)); return 0; }
bool SysInfo::GetAllProcess() { kern_return_t error; processor_set_t *psets, pset; task_t *tasks; unsigned i, j, pcnt, tcnt; m_nTotalTime = 0; host_priv_t libtop_port = mach_host_self(); // 必须获得系统root权限才能访问所有process list,下面这段代码不能获得,暂用pxl制作包来解决权限问题 host_t myhost = mach_host_self(); processor_set_name_t p_default_set; processor_set_t p_default_set_control; /* get the default processor set */ error = processor_set_default(myhost, &p_default_set); if (KERN_SUCCESS != error) { printf("Error in processor_set_default(): %s \n",mach_error_string(error)); char szInfo[256] = { 0 }; snprintf(szInfo, sizeof(szInfo) - 1, "processor_set_default error"); LogMsg(szInfo); } /* get the control port for this processor set */ error = host_processor_set_priv(myhost, p_default_set, &p_default_set_control); if (KERN_SUCCESS != error) { } error = host_processor_sets(libtop_port, &psets, &pcnt); if (error != KERN_SUCCESS) { GetProcessInfo(mach_task_self()); return TRUE; } m_pInfoList.clear(); for (i = 0; i < pcnt; i++) { error = host_processor_set_priv(libtop_port, psets[i], &pset); if (error != KERN_SUCCESS) { printf("Error in host_processor_set_priv(): %s \n",mach_error_string(error)); char szInfo[256] = { 0 }; snprintf(szInfo, sizeof(szInfo) - 1, "host_processor_set_priv error"); LogMsg(szInfo); return true; } error = processor_set_tasks(pset, &tasks, &tcnt); if (error != KERN_SUCCESS) { printf("Error in processor_set_tasks(): %s \n",mach_error_string(error)); char szInfo[256] = { 0 }; snprintf(szInfo, sizeof(szInfo) - 1, "processor_set_tasks error"); LogMsg(szInfo); return true; } for (j = 0; j < tcnt; j++) { if (GetProcessInfo(tasks[j])) { return true; } mach_port_deallocate(mach_task_self(),tasks[j]); } error = vm_deallocate((vm_map_t)mach_task_self(),(vm_address_t)tasks, tcnt * sizeof(task_t)); if (error != KERN_SUCCESS) { printf("Error in vm_deallocate(): %s \n",mach_error_string(error)); return true; } if ((error = mach_port_deallocate(mach_task_self(),pset)) != KERN_SUCCESS || (error = mach_port_deallocate(mach_task_self(),psets[i])) != KERN_SUCCESS) { printf("Error in mach_port_deallocate(): %s \n",mach_error_string(error)); return true; } } error = vm_deallocate((vm_map_t)mach_task_self(),(vm_address_t)psets, pcnt * sizeof(processor_set_t)); if (error != KERN_SUCCESS) { printf("Error in vm_deallocate(): %s \n",mach_error_string(error)); return true; } return false; }