我是Mac编程的新手。我正在向OSX移植一个插件。我需要我的应用程序来启动第二个应用程序(我不控制其来源),然后获取其退出代码。 NSWorkspace launchApplicationAtURL非常适合用所需的参数启动它,但我看不到如何获取退出代码。在设置终止第二个应用程序的通知后,有没有办法获得它?我看到了使用NSTask获取退出代码的工具。我应该使用它吗?
答案 0 :(得分:6)
NSWorkspace
方法实际上是用于启动独立应用程序;根据文档使用NSTask
“将另一个程序作为子进程运行并监视程序的执行情况。”
这是一个启动可执行文件并返回其标准输出的简单方法 - 它阻止等待完成:
// Arguments:
// atPath: full pathname of executable
// arguments: array of arguments to pass, or nil if none
// Return:
// the standard output, or nil if any error
+ (NSString *) runCommand:(NSString *)atPath withArguments:(NSArray *)arguments
{
NSTask *task = [NSTask new];
NSPipe *pipe = [NSPipe new];
[task setStandardOutput:pipe]; // pipe standard output
[task setLaunchPath:atPath]; // set path
if(arguments != nil)
[task setArguments:arguments]; // set arguments
[task launch]; // execute
NSData *data = [[pipe fileHandleForReading] readDataToEndOfFile]; // read standard output
[task waitUntilExit]; // wait for completion
if ([task terminationStatus] != 0) // check termination status
return nil;
if (data == nil)
return nil;
return [NSString stringWithUTF8Data:data]; // return stdout as string
}
您可能不想阻止,特别是如果这是您的主UI线程,请提供标准输入等。
答案 1 :(得分:1)
事实上,NSTask的这个属性应该可以解决这个问题:terminationStatus
来自Apple的文档:
返回接收者可执行文件返回的退出状态。
我测试了它并且工作正常。注意测试任务是否先运行,否则将启动异常。
if (![aTask isRunning]) {
int status = [aTask terminationStatus];
if (status == ATASK_SUCCESS_VALUE)
NSLog(@"Task succeeded.");
else
NSLog(@"Task failed.");
}
希望它有所帮助。