2010-04-25 14 views
5

Il mio problema non è lo scenario migliore per fork(). Tuttavia, questa è la funzione migliore che posso ottenere.all'interno dell'applicazione Cocoa

Sto lavorando a un plug-in per Firefox su Mac OSX. Per renderlo robusto, ho bisogno di creare un nuovo processo per eseguire il mio plugin. Il problema è che, quando ho biforcato un nuovo processo, molto simile a questo:

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

Tuttavia, dal momento che lo Stato non è pulito, non posso inizializzato correttamente il mio nuovo processo (chiamare NSApplicationLoad etc.). Qualche idea? A proposito, certamente non voglio creare un nuovo binario ed eseguirlo.

risposta

3

In genere, è necessario exec() dopo fork() in Mac OS X.

Dalla pagina fork(2) man:

ci sono limiti a quello che si può fare nel processo figlio. Per essere totalmente sicuri, dovresti limitarti a eseguire solo operazioni sicure con segnale asincrono fino al momento in cui viene chiamata una delle funzioni exec. Tutte le API, compresi i simboli di dati globali, in qualsiasi framework o libreria, dovrebbero essere considerate non sicure dopo un fork(), a meno che non siano esplicitamente documentate come sicure o sicure. Se è necessario utilizzare questi framework nel processo figlio, è necessario eseguire exec. In questa situazione è ragionevole eseguire te stesso.

TN2083 anche i commenti su questo argomento

molti framework Mac OS X non funzionano in modo affidabile se si chiama fork ma non chiami exec. L'unica eccezione è il quadro del sistema e, anche lì, lo standard POSIX pone severi vincoli su ciò che si può fare tra un fork ed un exec.

IMPORTANTE: Infatti, in Mac OS X 10.5 e versioni successive, Core Foundation rileverà questa situazione e stampare il messaggio di avviso mostrato nel Listato 13.

13: Nucleo Fondazione lamentarsi fork-senza-exec

il processo è biforcuta e non è possibile utilizzare questa funzionalità CoreFoundation in modo sicuro. DEVI eseguire exec(). Interrompere su __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() per eseguire il debug.

2

fork senza exec è fondamentalmente completamente non sicuro su OSX. Ad esempio, finirai per avere porte Mach stantie.