Objective c 从Cocoa应用程序执行终端命令top
我想执行top并得到结果,以便知道一个进程使用了多少内存 首先,我想执行一个终端命令。我使用这个问题的代码 我尝试了正常运行时间,它工作得完美无瑕 但是,当我尝试使用top而不是正常运行时间时,出现以下错误: 打开终端时出错:未知。 或者,top在/usr/bin/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"
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以获得完美的答案。