2014-11-20 8 views
8

Ta linia kodu:Jak używać posix_spawn do zastąpienia przestarzałego "systemu", aby uruchomić opendiff w Objective-C?

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

daje mi to ostrzeżenie:

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

Czytałem trochę o posix_spawn, ale nie mogę dowiedzieć się, co równoważny linii kodu za pomocą posix_spawn będzie wyglądać.

Każda pomoc lub linki do próbek będą mile widziane.

Odpowiedz

12

Korzystanie posix_spawn(), aby odpowiedzieć na pytanie:

#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); 

Albo można użyć 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]; 

Jeśli nie potrzebujesz synchronizacji, po prostu usuń połączenie do waitpid() (upewnij się, że nazywasz to gdzieś e, lub skończysz z procesem zombie do czasu wyjścia Twojej aplikacji) lub [task waitUntilExit].

1

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() 
} 
Powiązane problemy