Objective c 保持NSTask会话运行-Cocoa

Objective c 保持NSTask会话运行-Cocoa,objective-c,cocoa,macos,terminal,nstask,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; p

我在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-jarserver.jar
,它会一直运行,直到退出会话。如果启动命令后会话不会自动结束,我将如何执行类似操作


我是否只需要注释掉它发布
NSTask
的部分?任何建议都很好

对不会立即退出的基础程序使用
NSTask
时:

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

  • 只有在确定任务不再运行时,才应使用
    -[NSTask release]
    。在这种情况下,在释放任务之前,应向其标准输入发送导致基础程序退出的命令(例如,相当于control-d的字符),或向其发送
    -终止
    -中断

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


  • 实际上,您根本不应该为此使用
    NSTask
    。改用
    Launchd
    ,因为它将允许服务器任务在应用程序外部进行维护,并且通常设计为完全满足所述需求。不过,如果您确实想使用
    NSTask
    。啊,Bavariable的答案是完全正确的。那是我当时唯一想到的例子。实际上,我并不是在服务器类型的情况下使用它。这些答案都不完整……如何“发送其标准输入命令,使基础程序退出(例如,相当于control-d的字符)”?你应该如何“改用Launchd”?据我所知。。launchd没有监视父进程生命周期的机制,并且很容易以僵尸子进程结束。不可爱。