Objective c NSTask vs系统-优缺点?
我在一个项目中需要调用系统命令。我最初开始研究NSTask(因为这似乎是最流行的方法),但最近我遇到了Objective c NSTask vs系统-优缺点?,objective-c,nstask,Objective C,Nstask,我在一个项目中需要调用系统命令。我最初开始研究NSTask(因为这似乎是最流行的方法),但最近我遇到了system命令。这看起来是一个简单得多的设置。我看到一些问题/答案说NSTask是更好的方法,但我看不出 这两者的优缺点是什么 在什么情况下,一个比另一个更有可能被使用 有什么帮助/链接/想法/想法吗?(是的……我在谷歌上搜索过)有一些不同。对他们中的一些人来说,总的来说,这是否是一种优势,可能很难说 system()启动一个shell。不要问 system()块。NSTask异步运行 sy
system
命令。这看起来是一个简单得多的设置。我看到一些问题/答案说NSTask是更好的方法,但我看不出
有什么帮助/链接/想法/想法吗?(是的……我在谷歌上搜索过)有一些不同。对他们中的一些人来说,总的来说,这是否是一种优势,可能很难说
- system()启动一个shell。不要问
- system()块。NSTask异步运行
- system()仅接受args。NSTask与管道一起工作
- system()只有一个整数退出代码。NSTask与管道一起工作。(是的,再次提及。这是用于输出。)
- system()接受完整的命令行。可以在数组中传递到NSTask参数
- system()在当前目录上运行。要执行NSTask,可以传递一个工作目录
NSTask
:
- 可以在后台运行他的任务。允许您向基础进程发送中断和终止,并允许您在不自行设置线程的情况下挂起或恢复基础进程。如果需要,还可以同步运行
- 让我们来回使用Cocoa类,比如
s,而不必进行buncha转换NSString
- 让我们为底层进程设置不同于调用方的I/O流
- 比
更好地支持所有苹果平台(如iOS)——我认为system(3)
甚至不能在iOS上运行system
- 需要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-我刚刚偶然发现了你的答案,这节省了我几个小时。当你回来的时候,我有一个好故事要讲。对你的答案投赞成票还不够。每个人都应该记住上面的六个事实。