我的问题很简单。 在Linux上,使用fork而不使用exec非常流行
但是,我发现在MacOS上这是不可能的(参见fork手册)
https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/fork.2.html
您在子进程中可以做的事情是有限的。为了完全安全,你应该自己限制自己 自我只执行异步信号安全操作,直到其中一个exec函数为止 调用。应假设任何框架或库中的所有API(包括全局数据符号)都是 fork()之后不安全,除非明确记录为安全或异步信号安全。如果你需要使用 这些框架在子进程中,你必须执行。在这种情况下,执行自己是合理的。
这对我来说很奇怪?是什么原因?是否有可能解决它?
答案 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。