2011-12-30 1 views
1

На 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.

ответ

1

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

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

+0

Да, практически все *, но * вызовы CF разрешены после 'fork()' - так много работы с сервером/демон. –

+0

@ duskwuff По крайней мере, некоторые из функций библиотеки C являются * не * безопасными после fork. – user877329

Смежные вопросы