How do you use posix_spawn to replace the deprecated 'system' to launch opendiff in Objective-C?

后端 未结 2 723
-上瘾入骨i
-上瘾入骨i 2021-02-02 02:43

This line of code:

system(\"/Applications/Xcode.app/Contents/Developer/usr/bin/opendiff /Users/LukeSkywalker/Documents/doc1.rtf /Users/LukeSkywalker/Documents/do         


        
相关标签:
2条回答
  • 2021-02-02 03:00

    Using posix_spawn(), to answer your question:

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

    Or, you could use 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];
    

    If you don't need it to be synchronous, just remove the call to waitpid() (make sure to call it somewhere else, or you'll end up with a zombie process until your app exits) or [task waitUntilExit].

    0 讨论(0)
  • 2021-02-02 03:01

    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()
    }
    
    0 讨论(0)
提交回复
热议问题