这是我第一个真正的可可项目。我编写了一个函数,该函数将NSString作为输入,使用NSTask运行ADB命令,并将终端输出返回给NSString。代码构建良好,但是当我按按钮运行该功能时,该应用程序冻结。当我强制关闭时,我在Thread 1: signal SIGTERM行上看到data = [file readDataToEndOfFile];

功能

NSString* runADBCommand(NSString *cmd)
{
    [[NSTask launchedTaskWithLaunchPath:adbPath
                              arguments:[NSArray arrayWithObjects: cmd, nil]]waitUntilExit];

    NSTask *adbDevices = [[NSTask alloc] init];
    adbDevices.launchPath = adbPath;
    NSString* devices = @"devices";
    adbDevices.arguments = @[devices];

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

    NSFileHandle *file;
    file = [pipe fileHandleForReading];

    NSData *data;
    data = [file readDataToEndOfFile];

    NSString *adbComOutput;
    adbComOutput = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    NSLog(@"\n\n%@", adbComOutput);
    return adbComOutput;
}


呼叫

- (void) getVersion:(id)sender
{
    runADBCommand(@"shell cat /system/build.prop | grep incremental");
}


我一直在网上寻找参考资料,但不确定要寻找什么。任何帮助表示赞赏!

最佳答案

signal SIGTERM消息是您强制退出该过程的结果。这就是完成强制退出的机制:POSIX信号(尤其是SIGTERM)被传递到目标进程,并且通常导致其终止。

由于正在调试过程,因此调试器将截获信号并告知您有关信息,以便您可以对其进行调试。当然,在这种情况下,您不希望调试此信号的接收。 (顺便说一句,您只需单击Xco​​de工具栏中的“停止”按钮即可停止卡住的进程,而不会产生副作用。您也可以单击“暂停”按钮来中断程序,而无需终止它来了解卡在哪里并调查原因。)

真正的问题是:为什么您对-readDataToEndOfFile的呼叫永远被阻止。原因很简单,您从未启动过将写输出然后关闭管道写端的任务。您永远不会呼叫[adbDevices launch]。当然,您需要在阻止等待其输出之前执行此操作。

同样,发布时的runADBCommand()函数实例化两个任务对象。第一行:

[[NSTask launchedTaskWithLaunchPath:adbPath
                          arguments:[NSArray arrayWithObjects: cmd, nil]]waitUntilExit];


创建并启动任务,然后等待其退出。然后,该函数继续创建一个完全不同的任务以运行devices命令。我怀疑这只是实验的残余。我只是想确保您知道它。

关于objective-c - 返回NSString时的SIGTERM,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28164265/

10-13 06:34