2

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

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

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

4

2 回答 2

9

NSTask

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

system(3)

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

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

于 2013-05-13T18:59:03.680 回答
7

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

  • system() 启动一个外壳。NSTask 没有。
  • 系统()块。NSTask 异步运行。
  • system() 只接受参数。NSTask 与管道一起工作。
  • system() 只有一个整数退出代码。NSTask 与管道一起工作。(是的,再次提到。这是用于输出。)
  • system() 采用完整的命令行。NSTask 参数可以在数组中传递。
  • system() 在当前目录上运行。NSTask 你可以传递一个工作目录。

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

于 2013-05-13T18:58:06.173 回答