返回 NSString 时的 SIGTERM
SIGTERM when returning NSString
这是我第一个真正的 Cocoa 项目。我编写了一个函数,它以 NSString 作为输入,使用 NSTask 来 运行 一个 ADB 命令,并且 returns 终端输出到 NSString。代码构建良好,但是当我按下按钮 运行 该功能时,应用程序冻结了。当我强制关闭时,我在行 data = [file readDataToEndOfFile];
上看到 Thread 1: signal SIGTERM
。
函数
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
命令完全不同的任务。我怀疑这只是实验的残余。我只是想确保你知道它。
这是我第一个真正的 Cocoa 项目。我编写了一个函数,它以 NSString 作为输入,使用 NSTask 来 运行 一个 ADB 命令,并且 returns 终端输出到 NSString。代码构建良好,但是当我按下按钮 运行 该功能时,应用程序冻结了。当我强制关闭时,我在行 data = [file readDataToEndOfFile];
上看到 Thread 1: signal SIGTERM
。
函数
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
命令完全不同的任务。我怀疑这只是实验的残余。我只是想确保你知道它。