В OS X справочная страница fork говорит следующее:
Существуют ограничения на то, что вы можете делать в дочернем процессе. Чтобы быть в полной безопасности, вы должны ограничить себя выполнением только безопасных операций с асинхронным сигналом до тех пор, пока не будет вызвана одна из функций exec. Все API, включая глобальные символы данных, в любом фреймворке или библиотеке следует считать небезопасными после fork(), если явно не задокументировано, что они безопасны или безопасны для асинхронных сигналов. Если вам нужно использовать эти фреймворки в дочернем процессе, вы должны выполнить exec. В этой ситуации разумно казнить себя.
Судя по нижнему колонтитулу справочной страницы, это, вероятно, было там долгое время:
4-е распределение в Беркли 4 июня 1993 г. 4-е распространение в Беркли
Я бы подумал, что вызов chdir(2) между fork() и exec() будет безопасным, но на его справочной странице не сказано, что он безопасен для асинхронных вызовов. Действительно ли это небезопасно? Если да, то действительно ли я должен изменить каталог перед fork()? Мне кажется неразумным.
То же самое касается setenv(3). Учитывая, что он вызывает malloc(), я думаю, что это небезопасно. Но нет эквивалента execvp, который позволяет мне передать среду. В частности, execvp ищет PATH. Самый близкий эквивалент, который я смог найти, который принимает аргумент среды, execve(), не ищет PATH.