这是我第一个真正的可可项目。我编写了一个函数,该函数将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
)被传递到目标进程,并且通常导致其终止。
由于正在调试过程,因此调试器将截获信号并告知您有关信息,以便您可以对其进行调试。当然,在这种情况下,您不希望调试此信号的接收。 (顺便说一句,您只需单击Xcode工具栏中的“停止”按钮即可停止卡住的进程,而不会产生副作用。您也可以单击“暂停”按钮来中断程序,而无需终止它来了解卡在哪里并调查原因。)
真正的问题是:为什么您对-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/