在Cocoa应用程序中fork

时间:2010-04-25 08:10:00

标签: cocoa macos fork

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

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

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

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

3 个答案:

答案 0 :(得分:3)

一般情况下,您需要在Mac OS X上exec()之后fork()

来自fork(2)手册页:

  

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

TN2083也对此主题发表评论:

  

如果您拨打fork但未拨打exec,则许多Mac OS X框架无法正常运行。唯一的例外是系统框架,即使在那里,POSIX标准也会对forkexec.

之间的操作造成严重限制      

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

     

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

     

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

http://freewrl.sourceforge.net/

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

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

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

干杯, ç