Получение статуса выхода после запуска приложения с помощью NSWorkspace launchApplicationAtURL - PullRequest
3 голосов
/ 14 марта 2011

Я новичок в программировании на Mac. Я портирую плагин на OSX. Мне нужно, чтобы мое приложение запустило второе приложение (исходный код которого я не контролирую) и затем получило его код выхода. NSWorkspace launchApplicationAtURL отлично работает, чтобы запустить его с необходимыми аргументами, но я не вижу, как получить код выхода. Есть ли способ получить его после настройки уведомления о прекращении работы второго приложения? Я вижу инструменты для получения кода выхода, используя вместо этого NSTask. Должен ли я использовать это?

Ответы [ 2 ]

6 голосов
/ 15 марта 2011

Методы 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
}

Возможно, вы не захотите блокировать, особенно если это ваш основной поток пользовательского интерфейса, стандартный ввод и т. Д.

1 голос
/ 03 января 2014

На самом деле, это свойство NSTask должно сработать: terminationStatus

Из документа Apple:

Возвращает состояние выхода, возвращаемое исполняемым файлом получателя.

  • (интермедиат) terminationStatus

Я проверил это, и оно работает нормально. Не упустите возможность проверить, выполняется ли задача первой, в противном случае будет запущено исключение.

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...