2010-04-25 15 views
5

Mi problema no es el mejor escenario para fork(). Sin embargo, este es el mejor juego que puedo obtener.fork dentro de la aplicación Cocoa

Estoy trabajando en un complemento de Firefox en Mac OSX. Para que sea robusto, necesito crear un nuevo proceso para ejecutar mi complemento. El problema es, cuando un nuevo proceso en forma de horquilla, muy parecido a éste:

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

Sin embargo, ya que el estado no se limpia, no puedo inicializado correctamente mi nuevo proceso (llamada NSApplicationLoad etc.). ¿Algunas ideas? Por cierto, ciertamente no quiero crear un nuevo binario y ejecutarlo.

Respuesta

3

En general, es necesario exec() después fork() en Mac OS X.

Desde la página fork(2) hombre:

hay límites a lo que puede hacer en el proceso hijo. Para estar totalmente seguro, debe restringirse a solo ejecutar operaciones seguras de señal asíncrona hasta que se llame a una de las funciones de ejecución. Se debe asumir que todas las API, incluidos los símbolos de datos globales, en cualquier marco o biblioteca son inseguras después de un fork() a menos que se haya documentado explícitamente que sean seguras o estén seguras para la señal asíncrona. Si necesita utilizar estos marcos en el proceso secundario, debe ejecutar. En esta situación, es razonable eximirse.

TN2083 también los comentarios sobre este tema:

Muchos marcos de Mac OS X no funcionan de forma fiable si se llama fork pero no llama exec. La única excepción es el marco del sistema y, incluso allí, el estándar POSIX impone restricciones severas sobre lo que puede hacer entre un fork y un exec.

IMPORTANTE: De hecho, en Mac OS X 10.5 y posteriores, Fundación Core detectará esta situación e imprimir el mensaje de advertencia que se muestra en el Listado 13.

Listado 13: Fundación Core quejándose de tenedor-sin-exec

el proceso se ha dividido y no se puede utilizar esta funcionalidad CoreFoundation segura. DEBE ejecutar(). Interrumpir __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() para depurar.

2

fork sin ejecutor es básicamente completamente inseguro en OSX. Por ejemplo, terminará con puertos de mach rancio.

Cuestiones relacionadas