保持NSTask会话运行 - 可可

时间:2011-05-29 00:24:05

标签: objective-c cocoa macos terminal nstask

我在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的部分?任何建议都会很好!

1 个答案:

答案 0 :(得分:7)

NSTask与不立即退出的基础程序一起使用时:

  1. 您不应使用-[NSFileHandle readDataToEndOfFile],因为文件没有结尾。相反,您应该使用-[NSFileHandle readInBackgroundAndNotify]在后​​台读取该任务的标准输出管道,并在数据可用时得到通知;

  2. 只有当您确定任务不再运行时,才应使用-[NSTask release]。在这种情况下,在释放任务之前,您应该向其标准输入发送导致底层程序退出的命令(例如,等同于 control - d 的字符),或发送-terminate-interrupt

  3. 您不应该使用-waitUntilExit,除非您已经产生了一个辅助线程来处理该任务。