NSTask产生了顶级流程。如何提取数据?

时间:2010-08-24 15:49:37

标签: objective-c cocoa macos

编辑1

此代码当前正在打印到控制台。我想要做的是获取字符串中的数据(并停止数据进入控制台),以便我可以解析它以获取特定信息。我希望我的问题很明确。如果需要,请要求澄清:)


编辑2

另一种选择可能是将其打印到文件中然后我可以从该文件中读取。只是不希望它打印到控制台:)


Hello Lovely Intelligent Computer People!

对此的任何帮助都会很棒。

到目前为止,我正在使用NSTask来生成一个进程:

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

NSArray *arguments;
arguments = [NSArray arrayWithObjects: @"-s", @"1",@"-l",@"3600",@"-stats",@"pid,cpu,time,command", nil];
[top_task setArguments: arguments];


NSPipe *pipe;
pipe = [NSPipe pipe];

[top_task setStandardInput:[NSPipe pipe]];

NSFileHandle *file;
file = [pipe fileHandleForReading];

[top_task launch];

现在,我如何以NSString的形式获取结果信息?

感谢所有人和任何帮助! :)

3 个答案:

答案 0 :(得分:3)

要启动计时器,您可能需要执行以下操作:

NSTask *topTask = [NSTask new];
[topTask setLaunchPath:@"/usr/bin/top"];
[topTask setArguments:[NSArray arrayWithObjects:@"-s", @"1", @"-l", @"3600", @"-stats", @"pid,cpu,time,command", nil]];

NSPipe *outputPipe = [NSPipe pipe];
[topTask setStandardOutput:outputPipe];
[topTask launch];

到目前为止,代码与您编写的代码非常相似,但您将不得不添加更多代码。为了在每次top更新时获取数据,您必须将这一行代码添加到最后:

[[outuputPipe fileHandleForReading] readToEndOfFileInBackgroundAndNotify];

每次NSFileHandleReadToEndOfFileCompletionNotification更新输出时,都会向您发送top(如果您注册),您可以在通知对象中查询传入数据并将其转换为NSString,如下所示:

NSString *outputString = [[[NSString alloc] initWithData:[[notification userInfo] objectForKey:NSFileHandleNotificationDataItem] encoding:NSUTF8StringEncoding] autorelease];

您可以在NSFileHandle documentationInteracting With the Operating System

中阅读相关内容

答案 1 :(得分:1)

您无条件地为标准输入设置管道。我想你会想要一个用于标准输出的管道,然后从中读取。

答案 2 :(得分:0)

您可以这样做:

[top_task waitUntilExit];
NSString *string = [[NSString alloc] initWithData:[file readDataToEndOfFile] encoding:NSUnicodeStringEncoding] autorelease];