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