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