objective-c - 从 Cocoa 应用程序执行终端命令 top

标签 objective-c cocoa

我想执行top并获取结果,以便了解进程使用了​​多少内存。

首先,我想执行一个终端命令。我使用这个问题的代码 Execute a terminal command from a Cocoa app

我尝试了正常运行时间,效果完美。

但是,当我尝试使用 top 而不是 uptime 时,出现以下错误:

打开终端时出错:未知。

或者,top在/usr/bin/top中,我不知道为什么它拒绝使用它。

这是我的代码:

   NSTask *task;
   task = [[NSTask alloc] init];
   [task setLaunchPath: @"/usr/bin/top"];

   /*NSArray *arguments;
   arguments = [NSArray arrayWithObjects: @"foo", @"bar.txt", nil];
   [task setArguments: arguments];*/

   NSPipe *pipe;
   pipe = [NSPipe pipe];
   [task setStandardOutput: pipe];

   NSFileHandle *file;
   file = [pipe fileHandleForReading];

   [task launch];

   NSData *data;
   data = [file readDataToEndOfFile];

   NSString *string;
   string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
   [label setStringValue: string];

   [string release];
   [task release];

第二个问题:我想做的是了解 Google Chrome 使用了多少内存。 因为它为每个选项卡使用一个进程,所以很难知道它总共使用了多少内存。

问题1:top的​​值每秒都在变化,如何获取值? 问题 2:如何在 top 的结果中搜索以便仅查找我想要的进程(假设我知道它们的名称)。

谢谢。

最佳答案

问题是像top这样的命令需要终端(=与之交互的窗口)来执行。

这意味着他们需要一个真实的窗口上下文,因为他们在窗口中动态显示结果(清除窗口,在整个终端窗口中显示“top”的输出,更重要的是,每 N 秒更新一次显示,重绘整个终端窗口)

因此,像 top 这样的命令需要一个真正的“终端”,这就是为什么当将 topNSTask 一起使用时,它会抛出“错误”打开终端”。

<小时/>

如果有一个选项可以避免命令的动态分页,而是输出单个镜头(不使用 ncurse 和终端动态),您可以查看 top 的手册页 (man top)显示)直接在标准输出上(也许可以尝试 top -l 1 -- 没有我的 Mac 来尝试并确认)。

或者更好的解决方案可能是挖掘像 ps (或其他?)这样的命令,而不是 top ,它会给你相同的信息,但直接在 stdout 而不是作为终端中的动态显示。

关于objective-c - 从 Cocoa 应用程序执行终端命令 top,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7553410/

相关文章:

objective-c - 在 MonoTouch 中释放/处理 UIViewController

objective-c - CALayer 不透明度动画

ios - NSString 在 CoreData 谓词中作为 float

iphone - 河豚算法 objective-c

objective-c - 小牛风格标记

objective-c - UITextField 使部分不可编辑

objective-c - 将新字符串从 objective-c 返回到 swift 时损坏的字符串

objective-c - 无法在 NSTableView 中编辑表格单元格

objective-c - Cocoa API - 它是否包含 diff api?

cocoa - subview 覆盖父 View