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

时间:2013-09-17 16:08:46

标签: c++ c macos fork exec

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

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

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

  

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

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

1 个答案:

答案 0 :(得分:7)

在OS X中使用fork是可以的,在Linux下使用fork的限制相同。 Linux has similar caveats

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

OS X提供了一些非常棒的功能,可以利用多个核心,例如可能值得考虑的Grand Central Dispatch

我建议您阅读Mike Ash关于OS X下的叉安全性的this article