11

我的问题很简单。在 Linux 上,使用不带 exec 的 fork 非常流行

但是,我发现在 MacOS 上这是不可能的(参见 fork 手册)

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/fork.2.html

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

这对我来说似乎很奇怪?是什么原因?是否有可能解决它?

4

1 回答 1

9

在 OS X 中使用 fork 是可以的,与在 Linux 中使用 fork 的限制相同。Linux也有类似的警告通过 Wayback Machine

如果您正在构建一个单线程应用程序并依赖于核心 UNIX API 和设计理念,那么您应该没问题。如果您要链接到其他库,您应该非常熟悉它们的行为。想象一下链接到一个启动后台线程的库——在 fork 之后,您将处于潜在的未定义状态,因为只克隆了调用 fork 的线程。

OS X 提供了一些很棒的功能来利用多核,例如可能值得考虑的Grand Central Dispatch 。

我建议你阅读Mike Ash 的这篇关于 OS X 下的分叉安全的文章。

于 2014-01-17T04:28:53.400 回答