Продолжайте сеанс NSTask - Какао - PullRequest
3 голосов
/ 29 мая 2011

Я запускаю простую команду grep в моем приложении Какао, например:

NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: @"/usr/bin/grep"];

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];
NSLog (@"grep returned:\n%@", string);

[string release];
[task release];

Однако мне несколько любопытно узнать, как команды вводятся через терминал, которые не выдают результат и невыполняется быстро, если не завершено с чем-то вроде Управление + C может быть запущено с этой техникой.Что-то вроде запуска java -jar server.jar, где он продолжает работать, пока не выйдет из сеанса.Как бы я сделал что-то подобное, когда сеанс не заканчивается автоматически после запуска команды?

Нужно ли мне просто закомментировать часть, где выпускается NSTask?Любые предложения будут хороши!

1 Ответ

7 голосов
/ 29 мая 2011

При использовании NSTask с базовой программой, которая не завершает работу немедленно:

  1. Не следует использовать -[NSFileHandle readDataToEndOfFile], поскольку у файла нет конца.Вместо этого вы должны использовать -[NSFileHandle readInBackgroundAndNotify] для чтения стандартного канала вывода этой задачи в фоновом режиме и получать уведомления при наличии данных;

  2. Вы должны использовать -[NSTask release] только тогда, когда выопределил, что задача больше не должна выполнятьсяВ этом случае перед выпуском задачи вы должны отправить на ее стандартный ввод команду, вызывающую выход из базовой программы (например, символы, эквивалентные control - d ), или отправитьэто -terminate или -interrupt.

  3. Не следует использовать -waitUntilExit, если вы не создали вторичный поток для решения этой задачи.

...