Objective c NSTask vs系统-优缺点?

Objective c NSTask vs系统-优缺点?,objective-c,nstask,Objective C,Nstask,我在一个项目中需要调用系统命令。我最初开始研究NSTask(因为这似乎是最流行的方法),但最近我遇到了system命令。这看起来是一个简单得多的设置。我看到一些问题/答案说NSTask是更好的方法,但我看不出 这两者的优缺点是什么 在什么情况下,一个比另一个更有可能被使用 有什么帮助/链接/想法/想法吗?(是的……我在谷歌上搜索过)有一些不同。对他们中的一些人来说,总的来说,这是否是一种优势,可能很难说 system()启动一个shell。不要问 system()块。NSTask异步运行 sy

我在一个项目中需要调用系统命令。我最初开始研究NSTask(因为这似乎是最流行的方法),但最近我遇到了
system
命令。这看起来是一个简单得多的设置。我看到一些问题/答案说NSTask是更好的方法,但我看不出

  • 这两者的优缺点是什么
  • 在什么情况下,一个比另一个更有可能被使用

  • 有什么帮助/链接/想法/想法吗?(是的……我在谷歌上搜索过)

    有一些不同。对他们中的一些人来说,总的来说,这是否是一种优势,可能很难说

    • system()启动一个shell。不要问
    • system()块。NSTask异步运行
    • system()仅接受args。NSTask与管道一起工作
    • system()只有一个整数退出代码。NSTask与管道一起工作。(是的,再次提及。这是用于输出。)
    • system()接受完整的命令行。可以在数组中传递到NSTask参数
    • system()在当前目录上运行。要执行NSTask,可以传递一个工作目录
    在没有重新检查文档的情况下,这是我脑海中的一些差异。这是一个概述。

    NSTask

    • 可以在后台运行他的任务。允许您向基础进程发送中断和终止,并允许您在不自行设置线程的情况下挂起或恢复基础进程。如果需要,还可以同步运行
    • 让我们来回使用Cocoa类,比如
      NSString
      s,而不必进行buncha转换
    • 让我们为底层进程设置不同于调用方的I/O流
    • system(3)
      更好地支持所有苹果平台(如iOS)——我认为
      system
      甚至不能在iOS上运行
    • 需要Cocoa和Objective-C
    • 不解释shell参数或对参数进行路径扩展
    系统(3)

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

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

    好答案--+1。需要澄清的一点是:如果没有严重的风险,你不可能真正
    fork exec
    Cocoa流程。它可以工作,但非常脆弱(
    NSTask
    在实现中做了大量工作以避免这种脆弱性)。是的,我从来不会在Cocoa下fork exec任何东西,只有当我们从一开始就放弃它时,这才是一个选项。@bbum您有没有参考资料来解释为什么fork/exec很脆弱?@koan文档中散布着各种警告。大多数情况下都支持在
    fork
    之后紧接着立即执行
    exec
    ,但最好通过
    NSTask
    ,这会进行一些内部把戏以确保安全。更好的方法是编写一个通过XPC与之通信的助手守护程序。启动一项新的、小的任务效率要高得多。2个答案,不能两者兼而有之。部门给你们的其他回应更多一些+1@AminNegm-我刚刚偶然发现了你的答案,这节省了我几个小时。当你回来的时候,我有一个好故事要讲。对你的答案投赞成票还不够。每个人都应该记住上面的六个事实。