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

Objective c 从Cocoa应用程序执行终端命令top,objective-c,cocoa,Objective C,Cocoa,我想执行top并得到结果,以便知道一个进程使用了多少内存 首先,我想执行一个终端命令。我使用这个问题的代码 我尝试了正常运行时间,它工作得完美无瑕 但是,当我尝试使用top而不是正常运行时间时,出现以下错误: 打开终端时出错:未知。 或者,top在/usr/bin/top中,我不知道它为什么拒绝使用它 这是我的密码: NSTask *task; task = [[NSTask alloc] init]; [task setLaunchPath: @"/usr/bin/top"

我想执行top并得到结果,以便知道一个进程使用了多少内存

首先,我想执行一个终端命令。我使用这个问题的代码

我尝试了正常运行时间,它工作得完美无瑕

但是,当我尝试使用top而不是正常运行时间时,出现以下错误:

打开终端时出错:未知。

或者,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];
第二个问题:我想知道谷歌浏览器使用了多少内存。 因为它对每个选项卡使用一个进程,所以很难知道它总共使用了多少内存

问题1:top每秒都会更改其值,如何获取值? 问题2:我如何在top的结果中搜索,以便只找到我想要的进程(假设我知道它们的名称)


谢谢。

问题是像top这样的命令需要一个终端来执行

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

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


如果有一个选项可以避免命令的动态分页,而不是直接在stdout上输出一个快照(不使用ncurse和终端动态显示)(可以尝试
top-l 1
——这里没有我的Mac来尝试我自己并确认),那么您可以改为在top的手动页面(
man-top
)中进行检查


或者更好的解决方案可能是深入研究像
ps
(或其他?)这样的命令,而不是
top
,它将直接在stdout上提供相同的信息,而不是作为终端中的动态显示。

问题是,像top这样的命令需要一个终端来执行

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

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


如果有一个选项可以避免命令的动态分页,而不是直接在stdout上输出一个快照(不使用ncurse和终端动态显示)(可以尝试
top-l 1
——这里没有我的Mac来尝试我自己并确认),那么您可以改为在top的手动页面(
man-top
)中进行检查


或者更好的解决方案可能是深入研究像
ps
(或其他?)这样的命令,而不是
top
,它将直接在stdout上提供相同的信息,而不是作为终端中的动态显示。

对于第一个问题,请使用top的参数。比如说

top -l 1
这将提供一组输出

因此,在守则中:

NSArray *arguments;
arguments = [NSArray arrayWithObjects: @"-l 1", nil];
[task setArguments: arguments];

这将成功执行NSTask。

对于第一个问题,请使用top的参数。比如说

top -l 1
这将提供一组输出

因此,在守则中:

NSArray *arguments;
arguments = [NSArray arrayWithObjects: @"-l 1", nil];
[task setArguments: arguments];

这将成功执行NSTask。

对于包含进程信息的非交互式操作,我将使用而不是
top
对于包含进程信息的非交互式操作,我将使用而不是
top

NSTask不提供shell。谢谢,我不知道top需要一个窗口来执行,现在它有意义了。我将使用ps或ps的一个变体。现在,烦人的任务是在给出的巨大结果中爬行,以整理出我需要的信息…Tks以获得完美的答案。NSTask不提供外壳。谢谢,我不知道top需要一个窗口来执行,现在它有意义了。我将使用ps或ps的一个变体。现在,骚扰的任务是在给出的巨大结果中爬行,以整理出我需要的信息…Tks以获得完美的答案。