Могу ли я вызвать chdir или setenv после fork в Mac OS X?

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

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

Судя по нижнему колонтитулу справочной страницы, это, вероятно, было там долгое время:

4-е распределение в Беркли 4 июня 1993 г. 4-е распространение в Беркли

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

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


person George    schedule 30.12.2011    source источник


Ответы (1)


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

Насколько мне известно, все стандартные функции библиотеки C, включая chdir(), ЯВЛЯЮТСЯ безопасными для использования после fork().

person Community    schedule 30.12.2011
comment
Да, почти все, но вызовы CF разрешены после fork() - так работают многие реализации сервера/демона. - person Simon Urbanek; 31.12.2011
comment
@duskwuff По крайней мере, некоторые функции библиотеки C небезопасны после разветвления. - person user877329; 15.01.2014