在 Cocoa 应用程序中分叉

发布于 2024-08-30 08:05:25 字数 275 浏览 3 评论 0原文

我的问题不是 fork() 的最佳场景。然而,这是我能得到的最好的功能。

我正在 Mac OSX 上开发 Firefox 插件。为了使其健壮,我需要创建一个新进程来运行我的插件。问题是,当我分叉一个新进程时,很像这样:

if (fork() == 0) exit(other_main());

但是,由于状态未清理,我无法正确初始化我的新进程(调用 NSApplicationLoad 等)。有什么想法吗?顺便说一句,我当然不想创建一个新的二进制文件并执行它。

My problem is not the best scenario for fork(). However, this is the best func I can get.

I am working on a Firefox plugin on Mac OSX. To make it robust, I need to create a new process to run my plugin. The problem is, when I forked a new process, much like this:

if (fork() == 0) exit(other_main());

However, since the state is not cleaned, I cannot properly initialized my new process (call NSApplicationLoad etc.). Any ideas? BTW, I certainly don't want create a new binary and exec it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(3

想念有你 2024-09-06 08:05:25

一般来说,在 Mac OS X 上,您需要在 fork() 之后执行 exec()

来自 fork(2) 手册页:

您在子进程中可以执行的操作是有限的。为了完全安全,您应该限制自己只执行异步信号安全操作,直到调用 exec 函数之一为止。任何框架或库中的所有 API(包括全局数据符号)在 fork() 之后都应被假定为不安全,除非明确记录为安全或异步信号安全。如果需要在子进程中使用这些框架,则必须exec。在这种情况下,执行自己的命令是合理的。

TN2083 也对此主题发表了评论:

如果您调用 fork 但不调用 exec,许多 Mac OS X 框架将无法可靠地工作。唯一的例外是系统框架,即使在那里,POSIX 标准也对 forkexec 之间可以执行的操作设置了严格的限制。

重要提示:事实上,在 Mac OS X 10.5 及更高版本中,Core Foundation 将检测到这种情况并打印清单 13 中所示的警告消息。

清单 13: Core Foundation 抱怨 fork-without-exec

该进程已分叉,您无法安全地使用此 CoreFoundation 功能。你必须执行()。
中断 __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() 进行调试。

In general, you need to exec() after fork() on Mac OS X.

From the fork(2) man page:

There are limits to what you can do in the child process. To be totally safe you should restrict your-self to only executing async-signal safe operations until such time as one of the exec functions is called. All APIs, including global data symbols, in any framework or library should be assumed to be unsafe after a fork() unless explicitly documented to be safe or async-signal safe. If you need to use these frameworks in the child process, you must exec. In this situation it is reasonable to exec yourself.

TN2083 also comments on this subject:

Many Mac OS X frameworks do not work reliably if you call fork but do not call exec. The only exception is the System framework and, even there, the POSIX standard places severe constraints on what you can do between a fork and an exec.

IMPORTANT: In fact, in Mac OS X 10.5 and later, Core Foundation will detect this situation and print the warning message shown in Listing 13.

Listing 13: Core Foundation complaining about fork-without-exec

The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec().
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug.

随波逐流 2024-09-06 08:05:25

没有 exec 的 fork 在 OSX 上基本上是完全不安全的。例如,您最终会得到陈旧的机器端口。

fork without exec is basically entirely unsafe on OSX. You will end up with stale mach ports for example.

我只土不豪 2024-09-06 08:05:25

我正在为 Firefox(目前是 Linux,很快会是 Mac 和 Windows)编写 FreeWRL 插件。

http://freewrl.sourceforge.net/

它基于 fork+exec 来启动 FreeWRL 并吞下其窗口进入火狐浏览器。

您必须使用管道来正确处理 fork+exec 可能出现的失败或子进程的失败:

如何处理 fork() 之后的 execvp(...) 错误?

干杯,
C

I'm writing the FreeWRL plugin for Firefox (Linux at the moment, Mac & Windows soon).

http://freewrl.sourceforge.net/

It's based on fork+exec to launch FreeWRL and swallow its window into Firefox.

You'll have to use a pipe to correctly handle the possible failure of fork+exec or the failure of your child process :

How to handle execvp(...) errors after fork()?

Cheers,
C

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