Get system information on MacOS X?

Using C ++, can I get basic information about a computer? For example, is there a way to check how much memory is used (the whole computer, not just my computer), total available memory, virtual memory usage, processor usage, network statistics, etc.?

I use Mac OS X Snow Leopard, but I would prefer a solution that can be implemented for all Mac OS (i.e. Lion)

+2
source share
2 answers

For system-wide memory usage information on MacOS / X, open and read the file / usr / bin / vm _stat, something like this:

static double ParseMemValue(const char * b) { while((*b)&&(isdigit(*b) == false)) b++; return isdigit(*b) ? atof(b) : -1.0; } // Returns a number between 0.0f and 1.0f, with 0.0f meaning all RAM is available, and 1.0f meaning all RAM is currently in use float GetSystemMemoryUsagePercentage() { FILE * fpIn = popen("/usr/bin/vm_stat", "r"); if (fpIn) { double pagesUsed = 0.0, totalPages = 0.0; char buf[512]; while(fgets(buf, sizeof(buf), fpIn) != NULL) { if (strncmp(buf, "Pages", 5) == 0) { double val = ParseMemValue(buf); if (val >= 0.0) { if ((strncmp(buf, "Pages wired", 11) == 0)||(strncmp(buf, "Pages active", 12) == 0)) pagesUsed += val; totalPages += val; } } else if (strncmp(buf, "Mach Virtual Memory Statistics", 30) != 0) break; // Stop at "Translation Faults", we don't care about anything at or below that } pclose(fpIn); if (totalPages > 0.0) return (float) (pagesUsed/totalPages); } return -1.0f; // indicate failure } 

For the CPU usage indicator, follow these steps:

 #include <mach/mach_init.h> #include <mach/mach_error.h> #include <mach/mach_host.h> #include <mach/vm_map.h> static unsigned long long _previousTotalTicks = 0; static unsigned long long _previousIdleTicks = 0; // Returns 1.0f for "CPU fully pinned", 0.0f for "CPU idle", or somewhere in between // You'll need to call this at regular intervals, since it measures the load between // the previous call and the current one. float GetCPULoad() { host_cpu_load_info_data_t cpuinfo; mach_msg_type_number_t count = HOST_CPU_LOAD_INFO_COUNT; if (host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO, (host_info_t)&cpuinfo, &count) == KERN_SUCCESS) { unsigned long long totalTicks = 0; for(int i=0; i<CPU_STATE_MAX; i++) totalTicks += cpuinfo.cpu_ticks[i]; return CalculateCPULoad(cpuinfo.cpu_ticks[CPU_STATE_IDLE], totalTicks); } else return -1.0f; } float CalculateCPULoad(unsigned long long idleTicks, unsigned long long totalTicks) { unsigned long long totalTicksSinceLastTime = totalTicks-_previousTotalTicks; unsigned long long idleTicksSinceLastTime = idleTicks-_previousIdleTicks; float ret = 1.0f-((totalTicksSinceLastTime > 0) ? ((float)idleTicksSinceLastTime)/totalTicksSinceLastTime : 0); _previousTotalTicks = totalTicks; _previousIdleTicks = idleTicks; return ret; } 

For network statistics, I don’t know the solution (except, perhaps, run netstat and analyze the results somehow ... it depends on what network statistics you are interested in, I suppose).

+8
source

First of all, if you focus only on Mac OS, then the language of choice should be Objective - C.

The steps you need to complete

0
source

Source: https://habr.com/ru/post/1389969/


All Articles