Objective c 保持NSTask会话运行-Cocoa
我在Cocoa应用程序中运行一个简单的grep命令,如下所示: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
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没有监视父进程生命周期的机制,并且很容易以僵尸子进程结束。不可爱。