【问题标题】:NSTask vs System - pros and cons?NSTask vs System - 优点和缺点?
【发布时间】:2013-05-13 18:40:41
【问题描述】:

我正处于需要调用系统命令的项目中。我最初开始查看 NSTask(因为这似乎是最流行的方法),但最近我刚刚遇到了 system 命令。它看起来比 NSTask 更容易设置。我看到一些问题/答案说 NSTask 是更好的方法,但我没有看到

  1. 两者的优缺点是什么
  2. 在什么情况下,一种比另一种更有可能被使用

任何帮助/链接/想法/想法? (是的..我做了谷歌搜索)

【问题讨论】:

    标签: objective-c nstask


    【解决方案1】:

    NSTask:

    • 可以在后台运行他的任务。允许您向底层进程发送中断和终止,并允许您挂起或恢复底层进程而无需自己设置线程。如果您愿意,也可以同步运行。
    • 让您来回使用 Cocoa 类,例如 NSStrings,而无需进行大量转换。
    • 让我们为与调用者不同的底层进程设置 I/O 流。
    • system(3) 在所有 Apple 平台(如 iOS)上得到更好的支持——我认为 system 甚至不能在 iOS 上运行。
    • 需要 Cocoa 和 Objective-C。
    • 不解释 shell 参数或对参数进行路径扩展。

    system(3):

    • 在所有类 Unix 平台上得到更好的支持。
    • 可以使用单线运行任务。
    • 只需要 C.
    • 在 shell 中运行并将解释工作目录和参数,如 /bin/sh 会。

    对于 Cocoa 应用程序,我总是使用 NSTask;我只使用system,如果我正在做一些必须是C的事情,或者我知道必须在非Mac环境下运行。事实上,system 非常脆弱,更强大的解决方案是使用fork-exec,因为它允许您更好地控制流和并发操作。

    【讨论】:

    • 好答案——+1。澄清一点:你不能真正 fork-exec 一个没有严重风险的 Cocoa 进程。它可以工作,但非常脆弱(NSTask 在实现中做了很多事情来避免这种脆弱性)。
    • 是的,我永远不会在 Cocoa 下 fork-exec 任何东西,如果我们从一开始就放弃它,这只是一个选择。
    • @bbum 你有参考资料来解释为什么 fork/exec 很脆弱吗?
    • @koan 文档中散布着各种警告。 大部分支持fork,然后是立即的exec,但您最好通过NSTask,它会进行一些内部恶作剧以使其安全。更好的是编写一个通过 XPC 与之通信的助手守护程序。启动一项新的小型任务效率更高。
    【解决方案2】:

    存在一些差异。对于他们中的一些人来说,一般来说,这是否是一种优势可能很难说。

    • system() 启动一个 shell。 NSTask 没有。
    • system() 块。 NSTask 异步运行。
    • system() 只接受参数。 NSTask 与管道一起工作。
    • system() 只有一个整数退出代码。 NSTask 与管道一起工作。 (是的,再次提到。这是为了输出。)
    • system() 采用完整的命令行。可以将 NSTask args 以数组的形式传递。
    • system() 在当前目录上运行。您可以向 NSTask 传递一个工作目录。

    在没有重新检查文档的情况下,这是我脑海中的一些差异。这是一个概述。

    【讨论】:

    • 2 个答案,不能同时选择。其他回应在部门更多。给你 +1
    • @AminNegm-Awad 我刚刚偶然发现了你的答案,它为我节省了几个小时。当你回来时,我有一个好故事要讲。不能足够支持你的答案。每个人都应该记住上面的六个事实。
    猜你喜欢
    • 2015-12-09
    • 2011-09-25
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多