Как вы используете 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.
Любая помощь или ссылки на образцы будут оценены.
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]
,
Swift 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()
}