首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Objective-C中如何使用posix_spawn来取代过时的'system‘来启动opendiff?

在Objective-C中如何使用posix_spawn来取代过时的'system‘来启动opendiff?
EN

Stack Overflow用户
提问于 2014-11-21 02:20:03
回答 2查看 10.5K关注 0票数 10

下面这行代码:

代码语言:javascript
复制
system("/Applications/Xcode.app/Contents/Developer/usr/bin/opendiff /Users/LukeSkywalker/Documents/doc1.rtf /Users/LukeSkywalker/Documents/doc2.rtf");

给我这样的警告:

代码语言:javascript
复制
'system' is deprecated: first deprecated in iOS 8.0 - Use posix_spawn APIs instead.

我读过一些关于posix_spawn的文章,但我想不出使用posix_spawn的等效代码行是什么样子的。

任何帮助或链接到样本将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-05 23:03:42

使用posix_spawn()回答您的问题:

代码语言:javascript
复制
#include <spawn.h>
extern char **environ;

(...)

代码语言:javascript
复制
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:

代码语言:javascript
复制
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]的调用。

票数 15
EN

Stack Overflow用户

发布于 2017-11-08 08:58:58

Swift 3,Xcode 8.3.1

代码语言:javascript
复制
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()
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27046728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档