返回NSString时的SIGTERM

时间:2015-01-27 06:10:16

标签: objective-c macos cocoa nsstring nstask

这是我的第一个真正的Cocoa项目。我编写了一个函数,它将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");
}

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

1 个答案:

答案 0 :(得分:1)

signal SIGTERM消息是您强行退出流程的结果。这就是强制退出的机制:POSIX信号,特别是SIGTERM,被传递到目标进程,通常会导致它终止。

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

真正的问题是:为什么你的-readDataToEndOfFile永久阻止。原因很简单,您从未启动过写入输出然后关闭管道写入端的任务。你永远不会打电话给[adbDevices launch]。当然,你需要在阻塞等待其输出之前执行

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

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

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