在 Mac OS X 上检索系统信息 [关闭]

Posted

技术标签:

【中文标题】在 Mac OS X 上检索系统信息 [关闭]【英文标题】:Retrieve system information on Mac OS X [closed] 【发布时间】:2012-02-02 22:27:24 【问题描述】:

使用 C++,我有没有办法获得有关计算机的基本信息?

例如,有没有一种方法可以检查正在使用的内存量(整台计算机而不仅仅是我的计算机)、可用的总内存、虚拟内存使用情况、CPU 使用情况、网络统计信息等等?

我正在使用Mac OS X v10.6 (Snow Leopard),但我更喜欢可以为所有 Mac OS 实施的解决方案(例如,Mac OS X v10.7 (Lion))。

【问题讨论】:

只是为了记录,您只关心不同Mac平台上的可移植性,而不是一般的便携式解决方案? c++ 本身不提供此类功能,因此任何解决方案都或多或少依赖于平台 通用的便携式解决方案将是完美的,但正如您所提到的,该解决方案可能取决于平台。如果可能的话,我更喜欢独立于平台的解决方案,但因为这不太可能我可以满足于不同 Mac 平台上的可移植性。 我没有投反对票,但如果我不得不猜测我会说它,因为你的问题不是很好,这意味着它的方式很广泛(究竟什么是“基本信息”,告诉您如何检索几乎任何东西都需要几个小时(或更长时间)。此外,您并没有在问题中真正指定您感兴趣的平台(仅暗示)。告诉我们您需要什么信息通常会有所帮助也是。 我对此投了反对票,因为您没有任何努力的证明。我不使用 OS X,但 90 秒的谷歌搜索得到了这个问题的答案,即使使用模糊的术语...... @Farhad:虽然我们在这里分享知识和所有这些,但提出问题的人至少会努力为他/她自己找出答案,这是一种普遍的礼貌。此外,您既没有告诉我们您需要什么信息,也没有告诉我们您需要它们做什么(如果您不了解自己,更有经验的人可能会从中推断出您需要什么)。一般来说,这个网站是针对具体问题(希望)有明确的答案,而不是归结为“请为我完成所有工作”的请求。看***.com/questions/how-to-ask 【参考方案1】:

有关 Mac OS X 下的系统范围内存使用信息,请打开并读取文件 /usr/bin/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 并以某种方式解析结果......这取决于我想你对什么网络统计感兴趣)。

【讨论】:

感谢您提供此代码,我将其编辑为可编译;)【参考方案2】:

首先,如果您只关注 Mac OS,那么选择的语言应该是Objective-C。

您需要遵循的步骤

    学习 Objective-C。这并不难。我自己有 C++ 背景,在使用这种语言的平台上工作了几周后,我变得相当流利了 检查 Mac OS X 开发者库:Mac OS X Developer Library 查看this 还有this

【讨论】:

the language of choice should be Objective - C 为什么?这不是很主观吗?你能支持你的断言吗? 谢谢!只是想知道,但我也打算最终将程序迁移到 Windows,但至少不会持续几个月。那么我还应该用 Obj-C 编写程序吗?因为如果我用 C++ 编写,我觉得以后转移到 Windows 会更容易。 @LightnessRacesinOrbit 我相信他建议使用 Objective-C,因为 Obj-C 是 Mac OS 上通常使用的语言——就像 Windows 选择 C# 作为他们的语言 Obj-C 是 Apple 的选择。许多系统库可能有更好的 Obj-C API。 @Farhad:这很好,但它应该来自他,它应该在答案中。他把它变成了一个事实,而事实并非如此。就像“Windows 选择 C# 作为他们的语言”是相当狭隘的。 @LightnessRacesinOrbit 实际上,Windows 确实鼓励使用 C# 而不是其他语言——它的一些 API 是专门为 C# 制作的——说他们选择 C# 作为他们的语言,我的意思是他们不鼓励使用 C# 而不是其他语言通过更多 C# API 在他们的平台上使用语言。

以上是关于在 Mac OS X 上检索系统信息 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

客户机操作系统不是 Mac OS X Server. 此虚拟机将关闭. 这怎么解决,我用的是VM11

Mac OS X 是不是有 virt-manager 替代品? [关闭]

将 MacBook Air 从 OS X El Capitan 升级到 Mojave [关闭]

如何在 Mac OS X 中跟踪程序的系统调用?

Mac OS X NTP 服务开启与关闭

在 Mac OS X 上以编程方式获取睡眠时间(和其他节能设置)