【问题标题】:fork within Cocoa application在 Cocoa 应用程序中分叉
【发布时间】:2011-02-12 01:10:25
【问题描述】:

我的问题不是 fork() 的最佳方案。但是,这是我能得到的最好的功能。

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

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

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

【问题讨论】:

    标签: cocoa macos fork


    【解决方案1】:

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

    来自fork(2) 手册页:

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

    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__() 进行调试。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我正在为 Firefox 编写 FreeWRL 插件(目前是 Linux,即将推出 Mac 和 Windows)。

        http://freewrl.sourceforge.net/

        基于 fork+exec 启动 FreeWRL 并将其窗口吞入 Firefox。

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

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

        干杯, C

        【讨论】:

          猜你喜欢
          • 2016-11-17
          • 2010-11-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多