在可可应用程序中进行进程外工作吗?
我有一个可可应用程序,需要在第二个进程中完成一些工作(因为它可能会由于有缺陷的库而崩溃)。我想让我的项目尽可能简单,所以理想情况下我会使用与父进程相同的二进制文件,并仅使用命令行参数控制子进程。如果父进程能够获取新进程的 stdin 和 stdin 的句柄,那就太好了。 stdout 以便它们可以进行通信(尽管我用 pipeline() 创建的东西也可以工作)。以前有人解决过这个问题吗?你学到了什么?我有 Win32/Linux 背景,所以我不确定 Cocoa/OS X 是否有我应该使用的特殊功能。
I've got a cocoa app that needs to do some work in a second process (because it might crash due to buggy libraries). I'd like to keep my project as simple as possible, so ideally I would use the same binary as the parent process and just control the child with command line parameters. It would also be nice if the parent could get handles to the new process's stdin & stdout so that they can communicate (although something I create with pipe() would work too). Has anyone solved this problem before? What did you learn? I come from a Win32/Linux background, so I'm not sure if there are any special capabilities I get with Cocoa/OS X that I should be using.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
fork
和exec
在 Mac OS X 上的工作方式与在 Linux 和其他 POSIX 环境上的工作方式相同,但有一个问题:在 Cocoa 应用程序中,您不能只是fork
而不是exec
,因为 Core Foundation 不允许您在新进程中使用任何基于 CF 或 Cocoa 的 API。如果您在 Cocoa 应用程序中fork
,则必须立即exec
。您可以通过在
argv
的[0]
中使用您自己的argv[0]
来执行
相同的二进制文件您传递给exec
。有一个 Cocoa 版本的
fork
+exec
:创建一个 NSTask 并将其启动路径设置为您自己的[[[NSProcessInfo processInfo] arguments] objectAtIndex:0]
。由于上述原因,无法使用 NSTask 进行fork
和exec
操作。pipe
也可以如您所期望的那样工作。如果您使用 NSTask,则
pipe
的 Cocoa 版本为[NSPipe pipeline]
。fork
andexec
work the same on Mac OS X as on Linux and other POSIX environments, with one catch: In a Cocoa app, you can't justfork
and notexec
, because Core Foundation will not allow you to use any CF- or Cocoa-based APIs in the new process. If youfork
in a Cocoa app, you mustexec
pretty much immediately afterward.You can
exec
the same binary by using your ownargv[0]
in the[0]
of theargv
that you pass toexec
.There is a Cocoa version of
fork
+exec
: Create an NSTask and set its launch path to your own[[[NSProcessInfo processInfo] arguments] objectAtIndex:0]
. There is no way tofork
and notexec
with NSTask, for the above reason.pipe
also works as you would expect.If you use NSTask, the Cocoa version of
pipe
is[NSPipe pipe]
.