在 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 替代品? [关闭]