编辑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的形式获取结果信息?
感谢所有人和任何帮助! :)
答案 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 documentation和Interacting With the Operating System。
中阅读相关内容答案 1 :(得分:1)
您无条件地为标准输入设置管道。我想你会想要一个用于标准输出的管道,然后从中读取。
答案 2 :(得分:0)
您可以这样做:
[top_task waitUntilExit];
NSString *string = [[NSString alloc] initWithData:[file readDataToEndOfFile] encoding:NSUnicodeStringEncoding] autorelease];