форк в приложении Какао - PullRequest
       24

форк в приложении Какао

5 голосов
/ 25 апреля 2010

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 12 января 2011

В общем, вам нужно 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. Вы ДОЛЖНЫ выполнить (). Перерыв на __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() для отладки.

2 голосов
/ 12 января 2011

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

0 голосов
/ 05 апреля 2011

Я пишу плагин FreeWRL для Firefox (сейчас Linux, Mac и Windows).

http://freewrl.sourceforge.net/

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

Вам нужно будет использовать канал для правильной обработки возможного сбоя fork + exec или сбоя вашего дочернего процесса:

Как обрабатывать ошибки execvp (...) после fork ()?

Cheers, C

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...