2009-01-26 96 views

回答

10

有一个开放源码库在许多平台给出了这些(以及更多的系统信息的东西):SIGAR API

我用它在相当大的项目,它工作正常(除在OS X上的某些角落案例等)

5

不,没有,没有在标准中。

如果您确实需要此信息,您必须针对提供该信息的库编写特定于平台的#ifdefs或链接。

30

不幸的是,这些事情严重依赖于底层操作系统,所以没有平台无关的调用。 (也许有一些包装框架,但我不知道任何。)

在Linux上,你可以看看getrusage()函数调用,在Windows上,你可以使用GetProcessMemoryInfo()作为RAM使用。还可以看看Windows的Process Status API中的其他功能。

+5

为什么这会伤心? CPU/RAM/NUMA /(在此插入一个或多个首字母缩略词)使得平台独立报告机制有所限制。 – MSN 2009-01-28 16:45:21

11

对于我来说,没有一个平台无关的功能。如果您打算针对多个版本的Windows,请注意实施方式在某些版本中存在差异。我在测试NT 3.51下的应用程序时遇到了这个问题,例如......(古老的,我知道)。

这里是我用于内存方面的一些代码。这不适用于除Windows之外的其他平台,并且在编译时没有使用WIN32定义时将返回0:

编辑:我忘了提及,此代码划分并舍入到最近的MB,因此>> 20到处都是。

// get memory info... 
int getTotalRAM() 
{ 
    int ret = 0; 
#ifdef WIN32 
    DWORD v = GetVersion(); 
    DWORD major = (DWORD)(LOBYTE(LOWORD(v))); 
    DWORD minor = (DWORD)(HIBYTE(LOWORD(v))); 
    DWORD build; 
    if (v < 0x80000000) build = (DWORD)(HIWORD(v)); 
    else build = 0; 

    // because compiler static links the function... 
    BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0; 

    HINSTANCE hIL = LoadLibrary(L"kernel32.dll"); 
    GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx"); 

    if(GMSEx) 
    { 
     MEMORYSTATUSEX m; 
     m.dwLength = sizeof(m); 
     if(GMSEx(&m)) 
     { 
      ret = (int)(m.ullTotalPhys>>20); 
     } 
    } 
    else 
    { 
     MEMORYSTATUS m; 
     m.dwLength = sizeof(m); 
     GlobalMemoryStatus(&m); 
     ret = (int)(m.dwTotalPhys>>20); 
    } 
#endif 
    return ret; 
} 

int getAvailRAM() 
{ 
    int ret = 0; 
#ifdef WIN32 
    DWORD v = GetVersion(); 
    DWORD major = (DWORD)(LOBYTE(LOWORD(v))); 
    DWORD minor = (DWORD)(HIBYTE(LOWORD(v))); 
    DWORD build; 
    if (v < 0x80000000) build = (DWORD)(HIWORD(v)); 
    else build = 0; 

    // because compiler static links the function... 
    BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0; 

    HINSTANCE hIL = LoadLibrary(L"kernel32.dll"); 
    GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx"); 

    if(GMSEx) 
    { 
     MEMORYSTATUSEX m; 
     m.dwLength = sizeof(m); 
     if(GMSEx(&m)) 
     { 
      ret = (int)(m.ullAvailPhys>>20); 
     } 
    } 
    else 
    { 
     MEMORYSTATUS m; 
     m.dwLength = sizeof(m); 
     GlobalMemoryStatus(&m); 
     ret = (int)(m.dwAvailPhys>>20); 
    } 
#endif 
    return ret; 
} 

int getTotalMemory() 
{ 
    int ret = 0; 
#ifdef WIN32 
    DWORD v = GetVersion(); 
    DWORD major = (DWORD)(LOBYTE(LOWORD(v))); 
    DWORD minor = (DWORD)(HIBYTE(LOWORD(v))); 
    DWORD build; 
    if (v < 0x80000000) build = (DWORD)(HIWORD(v)); 
    else build = 0; 

    // because compiler static links the function... 
    BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0; 

    HINSTANCE hIL = LoadLibrary(L"kernel32.dll"); 
    GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx"); 

    if(GMSEx) 
    { 
     MEMORYSTATUSEX m; 
     m.dwLength = sizeof(m); 
     if(GMSEx(&m)) 
     { 
      ret = (int)(m.ullTotalPhys>>20) + (int)(m.ullTotalVirtual>>20); 
     } 
    } 
    else 
    { 
     MEMORYSTATUS m; 
     m.dwLength = sizeof(m); 
     GlobalMemoryStatus(&m); 
     ret = (int)(m.dwTotalPhys>>20) + (int)(m.dwTotalVirtual>>20); 
    } 
#endif 
    return ret; 
} 

int getAvailMemory() 
{ 
    int ret = 0; 
#ifdef WIN32 
    DWORD v = GetVersion(); 
    DWORD major = (DWORD)(LOBYTE(LOWORD(v))); 
    DWORD minor = (DWORD)(HIBYTE(LOWORD(v))); 
    DWORD build; 
    if (v < 0x80000000) build = (DWORD)(HIWORD(v)); 
    else build = 0; 

    // because compiler static links the function... 
    BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0; 

    HINSTANCE hIL = LoadLibrary(L"kernel32.dll"); 
    GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx"); 

    if(GMSEx) 
    { 
     MEMORYSTATUSEX m; 
     m.dwLength = sizeof(m); 
     if(GMSEx(&m)) 
     { 
      ret = (int)(m.ullAvailPhys>>20) + (int)(m.ullAvailVirtual>>20); 
     } 
    } 
    else 
    { 
     MEMORYSTATUS m; 
     m.dwLength = sizeof(m); 
     GlobalMemoryStatus(&m); 
     ret = (int)(m.dwAvailPhys>>20) + (int)(m.dwAvailVirtual>>20); 
    } 
#endif 
    return ret; 
} 
0

不直接。

但是,您可以使用抽象操作系统的库(如ACE)。
虽然这可能会有点沉重,如果你只是想要CPU和内存。

1

没有平台独立的方式来做到这一点。尽管对于Windows,您可以通过在代码中使用PDH.dll(性能数据助手)及其相关的API来获取CPU使用率和性能指标。

Here's more on how to use it.

2

在Linux上,这将使用/ proc/self/status。需要更多的工作才能将其转化为数字。但我觉得这很有用,只是将内存使用情况直接作为字符串打印到屏幕上。

static string memory_usage() { 
     ostringstream mem; 
     PP("hi"); 
     ifstream proc("/proc/self/status"); 
     string s; 
     while(getline(proc, s), !proc.fail()) { 
       if(s.substr(0, 6) == "VmSize") { 
         mem << s; 
         return mem.str(); 
       } 
     } 
     return mem.str(); 
} 
0

如果还在的话,请检查:

http://sourceforge.net/projects/cpp-cpu-monitor/

它给你一个例子,如何获得Linux操作系统(在Debian和CentOS测试)的CPU和RAM的使用和相当简单的指导如何安装。

请随时询问您是否对此小型项目有任何疑问。

相关问题