在Cocoa应用程序中fork

liu*_*liu 5 macos cocoa fork

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

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

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

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

小智 3

一般来说,在 Mac OS X 上您需exec()要这样做。fork()

fork(2)手册页:

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

TN2083也对此主题发表评论:

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

重要提示:事实上,在 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__()调试。