Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何像Activity Monitor那样以编程方式检查Mac上的可用系统内存?_Objective C_Xcode_Cocoa_Macos - Fatal编程技术网

Objective c 如何像Activity Monitor那样以编程方式检查Mac上的可用系统内存?

Objective c 如何像Activity Monitor那样以编程方式检查Mac上的可用系统内存?,objective-c,xcode,cocoa,macos,Objective C,Xcode,Cocoa,Macos,在MacOSX上,我可以看到活动监视器中有多少内存可用。如何以编程方式执行此操作?在UNIX上执行此操作的常用命令有 df-h用于硬盘驱动器使用 免费使用用于RAM和交换 然后,您将使用/链接其中的一个或多个来提取给定的信息之一:ack、sed、grep、head、cut 注意:如果您不打算“以编程方式”检查内存,我建议您使用top来了解哪些进程正在使用您的CPU和RAM。 Gnome系统监视器是它的GUI等价物之一。事实上,这只是事实的一半 free不是标准的UNIX命令,而是仅限Linu

在MacOSX上,我可以看到活动监视器中有多少内存可用。如何以编程方式执行此操作?

在UNIX上执行此操作的常用命令有

  • df-h用于硬盘驱动器使用
  • 免费使用用于RAM和交换
然后,您将使用/链接其中的一个或多个来提取给定的信息之一:ack、sed、grep、head、cut

注意:如果您不打算“以编程方式”检查内存,我建议您使用top来了解哪些进程正在使用您的CPU和RAM。
Gnome系统监视器是它的GUI等价物之一。

事实上,这只是事实的一半

free不是标准的UNIX命令,而是仅限Linux的命令。在BSD和OSX上都找不到它

因此,获取内存信息的更好方法是通过sysctl

即运行
sysctl-a | grep-Ei“(hw | vm)\..*mem”

你会明白的

要在C中以编程方式使用此功能,请参阅man sysctlbyname

另外,我看不出GNOME系统监视器在OSX上有什么帮助

不过,df是一个很好的提示

如果您只是计划使用shell收集这些数据并选择top,请阅读man top。您可以使用-l 1调用top以仅获取一个示例,并将流程表限制为,例如,使用-n 20的20个流程。 请记住,仅使用示例无法获取进程的CPU值,原因在手册页中概述

下面是一个简单的示例,可以从顶部获取有关内存的一些信息(仅限完整的行):

top-l1-n20 | grep-Ei“mem | vm”


希望这有帮助。

这应该可以。谷歌搜索结构中字段的确切含义,但从这段代码中可以看出,这应该是很自然的

#import <sys/sysctl.h>
#import <mach/host_info.h>
#import <mach/mach_host.h>
#import <mach/task_info.h>
#import <mach/task.h>
int mib[6]; 
mib[0] = CTL_HW;
mib[1] = HW_PAGESIZE;

int pagesize;
size_t length;
length = sizeof (pagesize);
if (sysctl (mib, 2, &pagesize, &length, NULL, 0) < 0)
{
    fprintf (stderr, "getting page size");
}

mach_msg_type_number_t count = HOST_VM_INFO_COUNT;

vm_statistics_data_t vmstat;
if (host_statistics (mach_host_self (), HOST_VM_INFO, (host_info_t) &vmstat, &count) != KERN_SUCCESS)
{
    fprintf (stderr, "Failed to get VM statistics.");
}

double total = vmstat.wire_count + vmstat.active_count + vmstat.inactive_count + vmstat.free_count;
double wired = vmstat.wire_count / total;
double active = vmstat.active_count / total;
double inactive = vmstat.inactive_count / total;
double free = vmstat.free_count / total;

task_basic_info_64_data_t info;
unsigned size = sizeof (info);
task_info (mach_task_self (), TASK_BASIC_INFO_64, (task_info_t) &info, &size);

double unit = 1024 * 1024;
memLabel.text = [NSString stringWithFormat: @"% 3.1f MB\n% 3.1f MB\n% 3.1f MB", vmstat.free_count * pagesize / unit, (vmstat.free_count + vmstat.inactive_count) * pagesize / unit, info.resident_size / unit];
#导入
#进口
#进口
#进口
#进口
int-mib[6];
mib[0]=CTL_HW;
mib[1]=HW_页面大小;
int页面大小;
尺寸与长度;
长度=sizeof(页面大小);
if(sysctl(mib,2,&pagesize,&length,NULL,0)<0)
{
fprintf(stderr,“获取页面大小”);
}
mach\u msg\u type\u number\u t count=HOST\u VM\u INFO\u count;
虚拟机统计数据虚拟机状态;
if(主机统计信息(mach\u host\u self()、主机VM\u INFO、(主机INFO\u t)&vmstat、&count)!=KERN\u成功)
{
fprintf(stderr,“无法获取VM统计信息”);
}
双倍合计=vmstat.wire\u计数+vmstat.active\u计数+vmstat.inactive\u计数+vmstat.free\u计数;
双线=vmstat.wire\u计数/总数;
双激活=vmstat.active\u计数/总数;
双不活动=vmstat.inactive\u计数/总数;
双自由=vmstat.free\u计数/总数;
任务\基本\信息\数据\信息;
无符号大小=sizeof(信息);
任务信息(mach_task_self(),task_BASIC_info_64,(task_info)&信息和大小);
双单位=1024*1024;
memLabel.text=[NSString stringWithFormat:@“%3.1f MB\n%3.1f MB\n%3.1f MB”,vmstat.free\u count*pagesize/unit,(vmstat.free\u count+vmstat.inactive\u count)*pagesize/unit,info.resident\u size/unit];

谢谢您的回答。我发现“top”非常方便使用。但是,如何以编程方式从“top”命令获取结果?我对shell相关的东西很陌生。它很有效!谢谢你用这段奇妙的代码帮助我!我说的对吗?我使用的是sysctlbyname,你必须使用#include#include。我将#imports添加到了应答器
vm_stat
命令,它的源代码也是一个很好的参考资料。看看
vm\u stat
可能是比
sysctl
更好的选择。