在可可应用程序中进行进程外工作吗?

发布于 2024-09-25 11:30:19 字数 259 浏览 4 评论 0原文

我有一个可可应用程序,需要在第二个进程中完成一些工作(因为它可能会由于有缺陷的库而崩溃)。我想让我的项目尽可能简单,所以理想情况下我会使用与父进程相同的二进制文件,并仅使用命令行参数控制子进程。如果父进程能够获取新进程的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

葬心 2024-10-02 11:30:19

我想让我的项目尽可能简单,所以理想情况下我会使用与父进程相同的二进制文件,并仅使用命令行参数控制子进程。

forkexec 在 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 进行 forkexec 操作。

如果父进程能够获取新进程的 stdin 和 stdin 的句柄,那就太好了。 stdout 以便它们可以进行通信(尽管我用 pipeline() 创建的东西也可以工作)。

pipe 也可以如您所期望的那样工作。

如果您使用 NSTask,则 pipe 的 Cocoa 版本为 [NSPipe pipeline]

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.

fork and exec work the same on Mac OS X as on Linux and other POSIX environments, with one catch: In a Cocoa app, you can't just fork and not exec, because Core Foundation will not allow you to use any CF- or Cocoa-based APIs in the new process. If you fork in a Cocoa app, you must exec pretty much immediately afterward.

You can exec the same binary by using your own argv[0] in the [0] of the argv that you pass to exec.

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 to fork and not exec with NSTask, for the above reason.

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).

pipe also works as you would expect.

If you use NSTask, the Cocoa version of pipe is [NSPipe pipe].

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文