Могу ли я вызвать chdir или setenv после форка на Mac OS X? - PullRequest
1 голос
/ 30 декабря 2011

В OS X на странице руководства для fork говорится следующее:

Существуют ограничения на то, что вы можете сделать в дочернем процессе.Для полной безопасности вы должны ограничиться выполнением только безопасных асинхронных сигналов операций до тех пор, пока не будет вызвана одна из функций exec.Все API, включая глобальные символы данных, в любой среде или библиотеке должны считаться небезопасными после fork (), если явно не задокументированы как безопасные или асинхронные сигналы.Если вам нужно использовать эти платформы в дочернем процессе, вы должны выполнить.В этой ситуации разумно выполнить себя.

Исходя из нижнего колонтитула страницы руководства, это, вероятно, было там долгое время:

4-й Беркли Дистрибуция июнь4, 1993 4-й дистрибутив Беркли

Я бы подумал, что chdir (2) будет безопасно вызывать между fork () и exec (), но на его странице руководства не сказано, что это безопасно дляасинхронные вызовы.Это на самом деле небезопасно?Если это так, я действительно должен изменить каталог перед fork ()?Мне кажется это неразумным.

То же самое касается setenv (3).Учитывая, что он вызывает malloc (), я думаю, что это, вероятно, небезопасно.Но нет эквивалента execvp, который позволяет мне передавать окружение.В частности, execvp ищет PATH.Ближайший эквивалент, который я смог найти, - это arg среды execve (), который не ищет PATH.

1 Ответ

1 голос
/ 30 декабря 2011

Первый блок текста, который вы цитируете («Есть ограничения ...»), был добавлен специально для Mac OS X - он пытается указать, что большинство библиотек и сред Apple (AppKit, Carbon, Foundation,и т. д.) не будет работать должным образом после fork().

Насколько я знаю, все стандартные функции библиотеки C, включая chdir(), ARE , безопасны для использования после fork().

...