我的问题不是fork()的最佳方案。但是,这是我能得到的最好的功能。
我正在使用Mac OSX上的Firefox插件。为了使其健壮,我需要创建一个新进程来运行我的插件。问题是,当我分叉一个新流程时,就像这样:
if (fork() == 0) exit(other_main());
但是,由于状态未清除,我无法正确初始化我的新进程(调用NSApplicationLoad等)。有任何想法吗?顺便说一下,我当然不想创建一个新的二进制文件并执行它。
答案 0 :(得分:3)
一般情况下,您需要在Mac OS X上exec()
之后fork()
。
来自fork(2)
手册页:
您在子进程中可以做的事情是有限的。为了完全安全,您应该将自己限制为仅执行异步信号安全操作,直到调用其中一个exec函数为止。除非明确记录为安全或异步信号安全,否则在fork()之后,应假定任何框架或库中的所有API(包括全局数据符号)都是不安全的。如果您需要在子进程中使用这些框架,则必须执行。在这种情况下,执行自己是合理的。
TN2083也对此主题发表评论:
如果您拨打
之间的操作造成严重限制fork
但未拨打exec
,则许多Mac OS X框架无法正常运行。唯一的例外是系统框架,即使在那里,POSIX标准也会对fork
和exec.
重要事项:事实上,在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()?
干杯, ç