3

次のように、Cocoa アプリで簡単な 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];

Controlただし、出力を出さず、 +などで終了しない限りすぐに実行されない、ターミナルから入力されたコマンドCをこの手法で実行する方法を知りたいと思っています。java -jar server.jarセッションを終了するまで実行し続ける場所で実行するようなもの。コマンドが起動された後、セッションが自動的に終了しないようなことをするにはどうすればよいですか?

を解放する部分をコメントアウトする必要がありNSTaskますか?どんな提案でもいいです!

4

1 に答える 1

6

NSTaskすぐに終了しない基になるプログラムで使用する場合:

  1. -[NSFileHandle readDataToEndOfFile]ファイルの終わりがないため、使用しないでください。代わりに、を使用-[NSFileHandle readInBackgroundAndNotify]してそのタスクの標準出力パイプをバックグラウンドで読み取り、データが利用可能になったときに通知を受ける必要があります。

  2. -[NSTask release]タスクをこれ以上実行しないと判断した場合にのみ使用してください。その場合、タスクを解放する前に、基礎となるプログラムを終了させるコマンド(たとえば、control-に相当する文字)を標準入力に送信するかd、またはを送信する必要があります。-terminate-interrupt

  3. -waitUntilExitそのタスクを処理するためにセカンダリスレッドを生成していない限り、使用しないでください。

于 2011-05-29T02:03:38.167 に答える