Как вы используете posix_spawn для замены устаревшей «системы» для запуска opendiff в Objective-C?

Эта строка кода:

system("/Applications/Xcode.app/Contents/Developer/usr/bin/opendiff /Users/LukeSkywalker/Documents/doc1.rtf /Users/LukeSkywalker/Documents/doc2.rtf");

дает мне это предупреждение:

'system' is deprecated: first deprecated in iOS 8.0 - Use posix_spawn APIs instead.

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

Буду признателен за любую помощь или ссылки на образцы.


person AaronG    schedule 20.11.2014    source источник


Ответы (2)


Используя posix_spawn(), чтобы ответить на ваш вопрос:

#include <spawn.h>
extern char **environ;

(...)

pid_t pid;
char *argv[] = {
    "/Applications/Xcode.app/Contents/Developer/usr/bin/opendiff",
    "/Users/LukeSkywalker/Documents/doc1.rtf",
    "/Users/LukeSkywalker/Documents/doc2.rtf",
    NULL
};

posix_spawn(&pid, argv[0], NULL, NULL, argv, environ);
waitpid(pid, NULL, 0);

Или вы можете использовать NSTask:

NSTask *task = [[NSTask alloc] init];
task.launchPath = @"/Applications/Xcode.app/Contents/Developer/usr/bin/opendiff";
task.arguments = [NSArray arrayWithObjects:
                  @"/Users/LukeSkywalker/Documents/doc1.rtf",
                  @"/Users/LukeSkywalker/Documents/doc2.rtf",
                  nil];
[task launch];
[task waitUntilExit];

Если вам не нужно, чтобы он был синхронным, просто удалите вызов waitpid() (обязательно вызовите его где-нибудь еще, иначе вы получите процесс-зомби, пока ваше приложение не выйдет) или [task waitUntilExit].

person Ivano.Bilenchi    schedule 05.01.2015

Свифт 3, Xcode 8.3.1

func system(_ command: String) {
    var args = command.components(separatedBy: " ")
    let path = args.first
    args.remove(at: 0)

    let task = Process()
    task.launchPath = path
    task.arguments = args
    task.launch()
    task.waitUntilExit()
}
person slashlos    schedule 08.11.2017
comment
API Process недоступен на iOS (списки вопросов OP iOS8) - person Craig Otis; 26.04.2019