在 Cocoa 应用程序中分叉
我的问题不是 fork() 的最佳场景。然而,这是我能得到的最好的功能。
我正在 Mac OSX 上开发 Firefox 插件。为了使其健壮,我需要创建一个新进程来运行我的插件。问题是,当我分叉一个新进程时,很像这样:
if (fork() == 0) exit(other_main());
但是,由于状态未清理,我无法正确初始化我的新进程(调用 NSApplicationLoad 等)。有什么想法吗?顺便说一句,我当然不想创建一个新的二进制文件并执行它。
My problem is not the best scenario for fork(). However, this is the best func I can get.
I am working on a Firefox plugin on Mac OSX. To make it robust, I need to create a new process to run my plugin. The problem is, when I forked a new process, much like this:
if (fork() == 0) exit(other_main());
However, since the state is not cleaned, I cannot properly initialized my new process (call NSApplicationLoad etc.). Any ideas? BTW, I certainly don't want create a new binary and exec it.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
一般来说,在 Mac OS X 上,您需要在
fork()
之后执行exec()
。来自
fork(2)
手册页:TN2083 也对此主题发表了评论:
In general, you need to
exec()
afterfork()
on Mac OS X.From the
fork(2)
man page:TN2083 also comments on this subject:
没有 exec 的 fork 在 OSX 上基本上是完全不安全的。例如,您最终会得到陈旧的机器端口。
fork without exec is basically entirely unsafe on OSX. You will end up with stale mach ports for example.
我正在为 Firefox(目前是 Linux,很快会是 Mac 和 Windows)编写 FreeWRL 插件。
http://freewrl.sourceforge.net/
它基于 fork+exec 来启动 FreeWRL 并吞下其窗口进入火狐浏览器。
您必须使用管道来正确处理 fork+exec 可能出现的失败或子进程的失败:
如何处理 fork() 之后的 execvp(...) 错误?
干杯,
C
I'm writing the FreeWRL plugin for Firefox (Linux at the moment, Mac & Windows soon).
http://freewrl.sourceforge.net/
It's based on fork+exec to launch FreeWRL and swallow its window into Firefox.
You'll have to use a pipe to correctly handle the possible failure of fork+exec or the failure of your child process :
How to handle execvp(...) errors after fork()?
Cheers,
C