这是我的第一个真正的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");
}
我一直在网上寻找参考资料,但我不确定该寻找什么。任何帮助表示赞赏!
答案 0 :(得分:1)
signal SIGTERM
消息是您强行退出流程的结果。这就是强制退出的机制:POSIX信号,特别是SIGTERM
,被传递到目标进程,通常会导致它终止。
由于正在调试该进程,调试器会拦截该信号并告诉您它,以便您可以对其进行调试。当然,在这种情况下,您对调试此信号的接收不感兴趣。 (顺便说一句,您只需单击Xcode工具栏中的“停止”按钮即可停止卡住的过程而不会产生此副作用。您也可以单击“暂停”按钮中断程序而不终止该程序以了解程序卡住的位置并调查原因。)
真正的问题是:为什么你的-readDataToEndOfFile
永久阻止。原因很简单,您从未启动过写入输出然后关闭管道写入端的任务。你永远不会打电话给[adbDevices launch]
。当然,你需要在阻塞等待其输出之前执行。
此外,发布它时的runADBCommand()
函数会实例化两个任务对象。第一行:
[[NSTask launchedTaskWithLaunchPath:adbPath
arguments:[NSArray arrayWithObjects: cmd, nil]]waitUntilExit];
创建并启动任务并等待它退出。然后,该函数继续创建一个完全不同的任务来运行devices
命令。我怀疑这只是一个实验的残余。我只是想确定你知道它。