2011-03-14 56 views
3

我在Mac编程方面很新颖。我正在向OSX移植一个插件。我需要我的应用程序启动第二个应用程序(我不控制源代码),然后获取退出代码。 NSWorkspace launchApplicationAtURL非常适合用所需的参数启动它,但我无法看到如何获取退出代码。在设置终止第二个应用程序的通知后有没有办法获得它?我看到了使用NSTask代替退出代码的工具。我应该使用它吗?使用NSWorkspace启动应用程序后退出状态launchApplicationAtURL

回答

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线程,供应标准输入等

+0

非常感谢!我有一个更加基本的NSTask版本,但这非常有用。我的困惑是NSTask vs NSWorkspace的相对目的。不知何故,我得到了NSWorkspace取代NSTask的印象。 – Ben 2011-03-15 15:11:07

+0

谢谢,最后一行我改回 [[[的NSString页头] initWithData:数据编码:NSUTF8StringEncoding]自动释放] 因为应用程序崩溃 – 2017-11-16 14:24:44

1

事实上,NSTask的这个属性应该做的伎俩:terminationStatus

从苹果的doc:

返回接收器的可执行文件返回的退出状态。

  • (INT)terminationStatus

我测试,它工作正常。注意测试任务是否先运行,否则将启动异常。

if (![aTask isRunning]) { 
    int status = [aTask terminationStatus]; 
    if (status == ATASK_SUCCESS_VALUE) 
     NSLog(@"Task succeeded."); 
    else 
     NSLog(@"Task failed."); 
} 

希望它能帮助。

相关问题