2014-11-20 7 views
8

Questa riga di codice:Come si usa posix_spawn per sostituire il "sistema" deprecato per avviare opendiff in Objective-C?

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

mi dà questo avvertimento:

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

Ho letto un po 'di posix_spawn, ma non riesco a capire che cosa una linea equivalente di codice utilizzando dovrebbe apparire posix_spawn.

Qualsiasi aiuto o collegamento a campioni sarebbe apprezzato.

risposta

12

Utilizzando posix_spawn(), per rispondere alla tua domanda:

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

Oppure, si potrebbe utilizzare 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]; 

Se non lo fai bisogno di essere sincrono, basta rimuovere la chiamata a waitpid() (assicurati di chiamarlo da qualche parte e, o finirai con un processo di zombi fino alla chiusura dell'app) o [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() 
} 
Problemi correlati