从xcode在终端中运行代码时的无限循环

时间:2009-08-12 11:29:43

标签: objective-c cocoa terminal

我正在编写一个小应用程序来跟踪本地单声道网站。我大部分时间都是为了自己的使用并且使用xcode

要启动服务器,请运行以下代码:

[task setLaunchPath: @"/usr/bin/xsp2"];
NSArray *arguments = [NSArray arrayWithObjects: @"--root", [[document selectedSite] valueForKey:@"path"], @"--nonstop" ,nil];
[task setArguments: arguments];
NSLog(@"argument: %@", arguments);

NSPipe *pipe = [NSPipe pipe];
[task setStandardOutput:pipe];

NSFileHandle *file = [pipe fileHandleForReading];

[task launch];

NSData *inData = nil;   
while ((inData = [file availableData]) && [inData length]) {
    NSLog(@"%@", [[NSString alloc] initWithData:inData encoding:NSUTF8StringEncoding]);
}

[[document selectedSite] setValue:[NSNumber numberWithInt:1] forKey:@"active"];

[task release];
NSLog(@"opened site");

这导致无限循环,因为终端永远不会停止写入(我猜?)。所以我的问题是,我如何停止循环?如果我不清楚,请评论。

2 个答案:

答案 0 :(得分:0)

当你说“终端从不停止写(我猜?)”时,是因为输出在终端或控制台中不断喷出?如果您没有获得大量输出,则可能会调用availableData块 - 请咨询the documentation。您可以尝试readDataToEndOfFile并查看它是否有帮助 - 除非它是一个非常大的文件(大于UINT_MAX字节),否则您不必将它放在循环中。

此外,意识到您(可能)在每次循环迭代时泄漏NSString。记得在NSLog()调用中自动释放字符串。

答案 1 :(得分:0)

是.. availableData将在您的情况下阻止,因为没有数据可用但它还没有遇到文件结尾(如果服务器关闭了它的管道末端,可能会发生这种情况)。

一种解决方案就是在另一个线程上监听输出。你的线程永远不会关闭,但也不会吃CPU。