NSTask порождает верхний процесс. Как извлечь данные? - PullRequest
0 голосов
/ 24 августа 2010

РЕДАКТИРОВАТЬ 1

Этот код в настоящее время печатается на консоли.Я хотел бы получить данные в виде строки ( и остановить их поступление на консоль ), чтобы я мог проанализировать их для получения конкретной информации.Я надеюсь, что мой вопрос ясен.Пожалуйста, попросите разъяснений, если это необходимо:)


РЕДАКТИРОВАТЬ 2

Другой альтернативой может быть распечатать его в файл, а затем я мог бы прочитать из этого файла впоследствии,Просто не хочу, чтобы он печатался на консоли:)


Здравствуйте, милые умные компьютерщики!

Любая помощь с этим была бы великолепна.

Пока что я использую 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 ]

3 голосов
/ 25 августа 2010

Чтобы запустить таймер, вам нужно сделать что-то вроде этого:

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 обновляется с выводом, и вы можете запросить объект уведомления для входящих данных и преобразовать его в строку NSSt следующим образом:

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

Вы можете прочитать об этом в Документация NSFileHandle и Взаимодействие с операционной системой .

1 голос
/ 24 августа 2010

Вы настроили канал для стандартного ввода без видимой причины. Я думаю, вы захотите канал для стандартного вывода, а затем читать из этого.

0 голосов
/ 24 августа 2010

Вы можете сделать это так:

[top_task waitUntilExit];
NSString *string = [[NSString alloc] initWithData:[file readDataToEndOfFile] encoding:NSUnicodeStringEncoding] autorelease];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...