我的问题不是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__()
调试。
归档时间: |
|
查看次数: |
2173 次 |
最近记录: |