1

在 OS X 上,fork 的手册页这样说:

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

根据手册页的页脚,这可能已经存在很长时间了:

第 4 次伯克利分发 1993 年 6 月 4 日 第 4 次伯克利分发

我原以为 chdir(2) 在 fork() 和 exec() 之间调用是安全的,但它的手册页并没有说它对于异步调用是安全的。事实上,它不安全吗?如果是这样,我真的希望在 fork() 之前更改目录吗?对我来说似乎不合理。

setenv(3) 也是如此。考虑到它调用 malloc(),我猜它可能不安全。但是没有等效的 execvp 可以让我通过环境。具体来说, execvp 搜索 PATH。我能找到的最接近的具有环境参数的等价物 execve() 不会搜索 PATH。

4

1 回答 1

1

您引用的第一段文本(“有限制......”)是专门为 Mac OS X 添加的——它试图指出大多数 Apple 的库和框架(AppKit、Carbon、Foundation 等)将后不能正常工作fork()

据我所知,所有标准 C 库函数,包括chdir()可以在fork().

于 2011-12-30T05:49:50.047 回答