2010-04-25 3 views
5

Моя проблема не в лучшем случае для fork(). Тем не менее, это лучшая функция, которую я могу получить.fork в приложении Cocoa

Я работаю над плагином Firefox на Mac OSX. Чтобы сделать его надежным, мне нужно создать новый процесс для запуска моего плагина. Проблема заключается в том, когда я раздвоенный новый процесс, так же, как это:

if (fork() == 0) exit(other_main());

Однако, поскольку государство не очищается, я не могу правильно инициализировать мой новый процесс (называют NSApplicationLoad и т.д.). Есть идеи? Кстати, я, конечно, не хочу создавать новый двоичный файл и выполнять его.

ответ

3

В общем, вам нужно exec() после fork() на Mac OS X.

На странице fork(2) людей:

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

TN2083 также комментарии по этой теме:

Многие структуры Mac OS X не работают надежно, если вы звоните fork но не называют exec. Единственным исключением является основой системы и, даже там, стандарт POSIX накладывает строгие ограничения на то, что вы можете сделать между fork и exec.

ВАЖНО: В самом деле, в Mac OS X 10.5 и позже, Core Foundation обнаружит эту ситуацию и вывести предупреждающее сообщение, показанное в листинге 13.

Листинг 13: Основной фонд жалуется на вилке-без-Exec

процесс раздвоенный, и вы не можете использовать эту функцию CoreFoundation безопасно. Вы ДОЛЖНЫ exec(). Перерыв на __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() для отладки.

2

fork без exec в основном полностью опасен на OSX. Например, в конечном итоге вы получите устаревшие порты mach.

0

Я пишу плагин FreeWRL для Firefox (Linux на данный момент, Mac & Windows скоро).

http://freewrl.sourceforge.net/

Он основан на вилке + Exec для запуска FreeWRL и поглотит его окно в Firefox.

Вы должны будете использовать трубу, чтобы правильно обработать возможную неисправность вилки + Exec или провал вашего дочернего процесса:

How to handle execvp(...) errors after fork()?

Приветствия, C

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