2012-01-05 2 views
2

Использование C++ в любом случае я мог получить основную информацию о компьютере? Например, есть ли способ проверить, сколько памяти используется (на всем компьютере, а не только на моем компьютере), общая доступная память, использование виртуальной памяти, использование ЦП, статистика сетей и т. Д.?Получить системную информацию о MacOS X?

Я использую Mac OS X Snow Leopard, но я предпочел бы решение, которое может быть реализовано для всех Mac ОС (т.е. Lion)

+0

Как раз для записи вам нужно только заботиться о переносимости на разных платформах Mac вместо общего портативного решения? Сам C++ не предлагает такую ​​функциональность, поэтому любое решение будет более или менее зависимым от платформы. – Grizzly

+0

Общее портативное решение было бы идеальным, но, как вы упомянули, решение, вероятно, будет зависящим от платформы. Если возможно, я предпочел бы независимое от платформы решение, но, поскольку это вряд ли, я могу согласиться на переносимость на разных платформах Mac. – fdh

+0

Кто бы ни проголосовал за вопрос, оправдайте себя. Не голосуйте без вопросов, не задавая причины проблемы. – fdh

ответ

7

Для общесистемной информации об использовании памяти под MacOS/X, открыть и прочитать файл/USR/бен/vm_stat , что-то вроде этого:

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 
} 

Для показателя использования CPU, сделать что-то вроде этого:

#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; 
} 

Для статистики сети я не знаю решения (кроме, возможно, для запуска netstat и анализа результатов как-то ... это зависит от того, какую статистику сети вы интересуете, я полагаю).

+0

Perfect Thanks! – fdh

+0

Спасибо за этот код, я его отредактировал для компиляции;) –

1

Во-первых, если вы сосредоточены только на Mac OS, то язык выбора должна быть цель - C.

шаги вы должны следовать

  1. Learn Obj-C, на самом деле не так сложно, я родом из C++ фона сам, и после нескольких недель работы на платформе с этим язык я стал довольно свободно
  2. Проверьте Библиотека разработчика Mac OSX: Mac OS X Developer Library
  3. Заканчивать this
  4. И this
+2

'язык выбора должен быть объективным - C' Почему? Разве это не очень субъективно? Можете ли вы поддержать свое утверждение? –

+0

Спасибо! Просто интересно, но я намерен в конечном итоге перенести программу на Windows, но не на пару месяцев. Так должен ли я писать программу в Obj-C? Потому что, если бы я написал на C++, мне было бы легче переносить на Windows позже. – fdh

+0

@LightnessRacesinOrbit Я считаю, что он предлагает Objective-C, потому что Obj-C - это язык, обычно используемый на Mac OS, - так же, как Windows выбирает C#, поскольку их язык Obj-C является выбором Apple. Многие из системных библиотек, вероятно, имеют лучший API Obj-C. – fdh

Смежные вопросы