为什么禁止在mac中使用fork而不使用exec?

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

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

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

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

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

在OS X中使用fork是可以的,在与Linux一起使用fork的相同限制下。 Linux 有类似的警告 。

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

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

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