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

怎甘沉沦 提交于 2019-12-03 07:36:01

问题


This line of code:

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

gives me this warning:

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

I've read a little bit about posix_spawn, but I can't figure out what an equivalent line of code using posix_spawn would look like.

Any help or links to samples would be appreciated.


回答1:


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].




回答2:


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()
}


来源:https://stackoverflow.com/questions/27046728/how-do-you-use-posix-spawn-to-replace-the-deprecated-system-to-launch-opendiff

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!