【问题标题】:Infinite loop when running code in terminal from xcode从xcode在终端中运行代码时的无限循环
【发布时间】:2009-08-12 11:29:43
【问题描述】:

我正在编写一个小应用程序来跟踪本地单声道网站。我写这个主要是为了自己使用和玩 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");

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

【问题讨论】:

    标签: objective-c cocoa terminal


    【解决方案1】:

    当您说“终端永远不会停止写入(我猜?)”时,是因为输出不断在终端或控制台中喷涌而出吗?如果您没有获得大量输出,则可能会调用 availableData 块 — 请参阅 the documentation。你可以试试readDataToEndOfFile 看看它是否有帮助——你不应该把它放在一个循环中,除非它是一个非常大的文件(大于 UINT_MAX 字节)。

    另外,请意识到您(可能)在循环的每次迭代中都泄漏了一个 NSString。记得在 NSLog() 调用中自动释放字符串。

    【讨论】:

    • 感谢您抽出宝贵的时间留下 Quinn 的答案,并感谢泄漏提示 :) 当我使用 readDataToEndOfFile 时,我的应用程序也会窒息(旋转的死亡披萨轮)。当我在终端中运行代码时,它会写入以下文本 xsp2 监听地址的 sn-p:0.0.0.0 根目录:/Users/Mads 监听端口:8080(非安全)点击返回以停止服务器。跨度>
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2013-01-24
      相关资源
      最近更新 更多