在 OS X 上,fork 的手册页这样说:
您可以在子进程中执行的操作是有限制的。为了完全安全,您应该限制自己只执行异步信号安全操作,直到调用其中一个 exec 函数。任何框架或库中的所有 API,包括全局数据符号,都应该在 fork() 之后被假定为不安全,除非明确记录为安全或异步信号安全。如果需要在子进程中使用这些框架,则必须执行。在这种情况下,执行自己是合理的。
根据手册页的页脚,这可能已经存在很长时间了:
第 4 次伯克利分发 1993 年 6 月 4 日 第 4 次伯克利分发
我原以为 chdir(2) 在 fork() 和 exec() 之间调用是安全的,但它的手册页并没有说它对于异步调用是安全的。事实上,它不安全吗?如果是这样,我真的希望在 fork() 之前更改目录吗?对我来说似乎不合理。
setenv(3) 也是如此。考虑到它调用 malloc(),我猜它可能不安全。但是没有等效的 execvp 可以让我通过环境。具体来说, execvp 搜索 PATH。我能找到的最接近的具有环境参数的等价物 execve() 不会搜索 PATH。